Last active
June 23, 2020 16:17
-
-
Save Aleksey-Danchin/d064f00515a1a9bdec63 to your computer and use it in GitHub Desktop.
Fabric function of the others quadratic functions.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function GetQuadraticFunction (a, b, c, d) { | |
return (function (a, b, c, d) { | |
function init (value, defaultValue) { | |
value = parseFloat(value); | |
if (Number.isNaN(value) || !Number.isFinite(value)) { | |
value = defaultValue; | |
} | |
return value; | |
} | |
a = init(a, 1); b = init(b, 0); c = init(c, 0); d = init(d, 0); | |
return function (x) { | |
return a * Math.pow(x - d, 2) + b * (x - d) + c; | |
} | |
})(a, b, c, d); | |
} |
- Я считаю формацию явного замыкания полезной. Может быть с точки зрения способностей языка это лишнее действие, но зато когда такое вижу однозначно знаю, что это фабрика. Знаю, что фабрика без использования переменных среды и привязки к внешнему контексту.
- С таким же успехом можно вынести инициализацию аргументов в функцию обертку ))). А вообще вынести init за пределы хорошая решение, но это гист одной функции. В какой-нибудь библиотеке, где используется init неоднократно, решение даже не обсуждалось бы.
- Т.е кроме "мне так удобно" никакого объяснения лишнему коду и потери производительности нет? ;) Кстати, что еще за "явное" замыкание? Есть "неявное"?
Да и вообще, строки 2,15 не создают никакого замыкания. Если бы у тебя между строками 1 и 2 было объявление каких-нибудь переменных/функций, тогда бы да. А так просто немедленно вызываемая функция, используемая для создания локальной области видимости. Очевидно, что кроме как "для красоты" она тут ни для чего не нужна, она итак внутри функции. - Как хочешь, просто,кажется, лучше читалось бы.
- В 7 строке у тебя что-то странное произошло, одно значение сравниваешь с булевским значением, другое нет:
if (Number.isNaN(value) || Number.isFinite(value) === false) {
По идее, как-то однородно должно быть:
if (Number.isNaN(value) || !Number.isFinite(value)) {
default
кстати зарезервированное слово, должно ошибку кидать
- Это просто квинтэссенция опыта. На дополнительном одноразовом вызове функции не создается потери производительности. Потерю создают циклы и утечка (ну и иррациональные алгоритмы). И закончим холивар, ото уже почти оскорбительно говорить об одном и том и объяснять одно и тоже.
- Мы будем обсуждать как проверять значение на false? Серьезно? (Про default ты прав, поменял. Спасибо.)
Для чего же сделаны тут коментарии, как не для спора, в котором рождается мигрень)
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Совсем немного.