Comments 13
> Не скажу за другие языки, но JS чертовски гибок! Этот, как и другие паттерны, не зашиты в синтаксис
Не поймите неправильно, я за паттерны, интерфейсы и мир во всем мире, но в чем смысл использования паттерна «Стратегия» в языке, где функции — это first class citizens (но нет интерфейсов)?
Не поймите неправильно, я за паттерны, интерфейсы и мир во всем мире, но в чем смысл использования паттерна «Стратегия» в языке, где функции — это first class citizens (но нет интерфейсов)?
+5
В том, что бы иметь возможность на-горячую менять часть реализации, оставляя общий каркас неизменным. Плевать на язык и его возможности. эта задача мультиплатформенная (:
Это используют например фреймворки для тестирования, логгеры, аутентификаторы и прочие инструменты позволяющие взаимодействовать с неограниченным количеством 3rd-part решений (будь-то JS код / БД / REST-сервисы и т.п.)
Это используют например фреймворки для тестирования, логгеры, аутентификаторы и прочие инструменты позволяющие взаимодействовать с неограниченным количеством 3rd-part решений (будь-то JS код / БД / REST-сервисы и т.п.)
+1
> что бы иметь возможность на-горячую менять часть реализации, оставляя общий каркас неизменным.
> Это используют например фреймворки для тестирования, логгеры
Я не сомневаюсь в нужности этого. Я пытаюсь сказать, что для того, чтобы передать один кусок кода в другой, в функциональном языке паттерн «Стратегия» не нужен.
> Это используют например фреймворки для тестирования, логгеры
Я не сомневаюсь в нужности этого. Я пытаюсь сказать, что для того, чтобы передать один кусок кода в другой, в функциональном языке паттерн «Стратегия» не нужен.
0
JS не функциональный язык. Он конечно умеет в функции, но не нужно игнорировать его ООП составляющую.
> для того, чтобы передать один кусок кода в другой, в функциональном языке
Наверняка, но моя дурная голова не смогла родить красивое решение в функциональном стиле.
Если вы знаете, как выполнить представленное выше ТЗ на JS в функциональном стиле, не прибегая к этому паттерну — умоляю, поделитесь кодом. Если все условия будут выполнены — обещаю добавить раздел с ним в статью, с пометкой вашего авторства.
> для того, чтобы передать один кусок кода в другой, в функциональном языке
Наверняка, но моя дурная голова не смогла родить красивое решение в функциональном стиле.
Если вы знаете, как выполнить представленное выше ТЗ на JS в функциональном стиле, не прибегая к этому паттерну — умоляю, поделитесь кодом. Если все условия будут выполнены — обещаю добавить раздел с ним в статью, с пометкой вашего авторства.
0
return (...args) => logToDOM.apply(null,[...args,options.node]);
Я думал что… были придуманы чтобы избавиться от костыля с apply.
return () => logToDOM(...arguments, options.node);
Вот так разве не покатит?
0
Почти. Идея хорошая, надо было сделать так:
return (...args) => logToDOM(...args, options.node);
Стрелочные функции не умеют в arguments
0
> Попробуем сделать это чистыми функциями:
> const logToDOM = (lvl,count,msg,node) => (node.innerHTML += `<div class="${lvl}">${count++}: ${msg}</div>`) && count;
Подождите, вы же сказали про Чистые функции и сами дали определение «без побочного эффекта».
При этом в примере у вас функция, которая имеет побочный эффект – изменяет состояние ноды.
> const logToDOM = (lvl,count,msg,node) => (node.innerHTML += `<div class="${lvl}">${count++}: ${msg}</div>`) && count;
Подождите, вы же сказали про Чистые функции и сами дали определение «без побочного эффекта».
При этом в примере у вас функция, которая имеет побочный эффект – изменяет состояние ноды.
+4
блииин (: а это правильно подмечено… что ж. зря я выбрал вывод на страницу. Но главное, что основную идею статьи не ломает.
Просто представьте что тут любой другой destination, который укладывается в понятие pure function.
Просто представьте что тут любой другой destination, который укладывается в понятие pure function.
0
Единственный destination, который укладывается в понятие pure function — это возврат результата. Но в этом случае сломается весь концепт сравнения.
Самый простой пример паттерна «стратегия» в js называют callback.
Pure function для этого не обязателен, но в целом возможен — Array.map(), Array.reduce().
Самый простой пример паттерна «стратегия» в js называют callback.
Pure function для этого не обязателен, но в целом возможен — Array.map(), Array.reduce().
0
Только изучаю функциональное программирование. Можете привести пример как оно будет выглядеть с читыми функциями. Хотя бы на словах.
0
раскурите декораторы
-2
function Logger(destination, lvl) {
return lvl => msg => destination(lvl, msg)
}
function logToConsole(methodForConsole = 'log') {
return (lvl, msg) => console[methodForConsole](`Level: ${lvl}, Message: ${msg}`)
}
function logToDom(node) {
return (lvl, msg) => node.innerHTML = msg
}
const loggerToConsole = Logger(logToConsole())
const warnToConsole = loggerToConsole('warn')
warnToConsole('Hello, world!')
const loggerToDom = Logger(logToDom(document.querySelector('#output')))
const errorToDom = loggerToDom('error')
errorToDom('<h1 style="color:red;">Oh no!</h1>')
Красиво, удобно, масштабируемо
0
Sign up to leave a comment.
Паттерн Стратегия на JavaScript