Pull to refresh

Comments 13

> Не скажу за другие языки, но JS чертовски гибок! Этот, как и другие паттерны, не зашиты в синтаксис

Не поймите неправильно, я за паттерны, интерфейсы и мир во всем мире, но в чем смысл использования паттерна «Стратегия» в языке, где функции — это first class citizens (но нет интерфейсов)?
В том, что бы иметь возможность на-горячую менять часть реализации, оставляя общий каркас неизменным. Плевать на язык и его возможности. эта задача мультиплатформенная (:
Это используют например фреймворки для тестирования, логгеры, аутентификаторы и прочие инструменты позволяющие взаимодействовать с неограниченным количеством 3rd-part решений (будь-то JS код / БД / REST-сервисы и т.п.)
> что бы иметь возможность на-горячую менять часть реализации, оставляя общий каркас неизменным.
> Это используют например фреймворки для тестирования, логгеры

Я не сомневаюсь в нужности этого. Я пытаюсь сказать, что для того, чтобы передать один кусок кода в другой, в функциональном языке паттерн «Стратегия» не нужен.
JS не функциональный язык. Он конечно умеет в функции, но не нужно игнорировать его ООП составляющую.

> для того, чтобы передать один кусок кода в другой, в функциональном языке
Наверняка, но моя дурная голова не смогла родить красивое решение в функциональном стиле.

Если вы знаете, как выполнить представленное выше ТЗ на JS в функциональном стиле, не прибегая к этому паттерну — умоляю, поделитесь кодом. Если все условия будут выполнены — обещаю добавить раздел с ним в статью, с пометкой вашего авторства.
return (...args) => logToDOM.apply(null,[...args,options.node]);

Я думал что… были придуманы чтобы избавиться от костыля с apply.
return () => logToDOM(...arguments, options.node);
Вот так разве не покатит?
> Попробуем сделать это чистыми функциями:
> const logToDOM = (lvl,count,msg,node) => (node.innerHTML += `<div class="${lvl}">${count++}: ${msg}</div>`) && count;

Подождите, вы же сказали про Чистые функции и сами дали определение «без побочного эффекта».
При этом в примере у вас функция, которая имеет побочный эффект – изменяет состояние ноды.
блииин (: а это правильно подмечено… что ж. зря я выбрал вывод на страницу. Но главное, что основную идею статьи не ломает.
Просто представьте что тут любой другой destination, который укладывается в понятие pure function.
Единственный destination, который укладывается в понятие pure function — это возврат результата. Но в этом случае сломается весь концепт сравнения.

Самый простой пример паттерна «стратегия» в js называют callback.
Pure function для этого не обязателен, но в целом возможен — Array.map(), Array.reduce().
Только изучаю функциональное программирование. Можете привести пример как оно будет выглядеть с читыми функциями. Хотя бы на словах.
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>')

Красиво, удобно, масштабируемо
Sign up to leave a comment.

Articles