- PVSM.RU - https://www.pvsm.ru -
Заинтересовался темой функционального программирования, увидел здесь [1] статью, и решил перевести, статья вышла небольшая, но интересная. Ссылка на оригинал. [2] Далее сам перевод.
Функциональное программирование становится всё более и более популярным во фронтенд разработке. Но что это, на самом деле?
Если вы фронтенд разработчик, вы вероятно знакомы с объектно-ориентированным программированием, даже если вы его не знаете. Многие JS библиотеки используют классы, которые могут быть созданы, для описания желаемого эффекта, например:
const waypoint = new Waypoint({
element: document.getElementById('thing'),
handler: () => console.log('You have scrolled to a thing')
})
JavaScript обычно используется в ООП, но ничто не мешает нам использовать его в функциональном программировании. Давайте взглянем, как они будут отличаться друг от друга.
Но сначала, дисклеймер, я знаю, что ФП против ООП это широкий, нюансированный, а иногда и нечеткий предмет. Ниже следует небольшое упрощение, возможно, ложной дихотомии. Тем не менее, я думаю, что фронтенд разработка может значительно выиграть от влияния ФП.
Начнём с небольшого аргумента, в сторону функционального программирования
(игра слов: fun — весело, poop — дерьмо)
Я хотел бы внести некоторый баланс здесь, но аргумент против функционального программирования состоит в том, что это… трудно. Это и понятно, даже термины звучат загадочно: монады, функторы, моноиды и все другие математические словечки могут оттолкнуть много людей. Haskell, чисто функциональный язык, известен тем, что его трудно понять.
Но вам не нужно переключаться на чисто функциональный язык, чтобы написать функциональный код. «Функциональный» язык означает, что язык был разработан с учетом функциональной парадигмы. JavaScript может быть функциональным, если вы этого хотите.
Во-первых, давайте попробуем получить более полную картину. Для меня, по крайней мере, разница примерно сводится к следующему:
Так почему же кто-то должен перестраивать своё
Давайте взглянем, как функциональный код будет отличаться от объектно-ориентированного на практике.
Представьте, что вы создаёте мир, и создаёте новую функцию — двери. Они могут быть закрыты или открыты, ограничивают или открывают доступ в комнату. Круто! Но нам нужен код, чтобы они работали, во-первых, функциональным образом:
// Чтобы не менять данные, первым аргументом для Object.assign будет пустой объект
// смотри: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
const open = obj => Object.assign({}, obj, {locked: false})
// теперь, давай сделаем дверь:
const myDoor = {
color: 'red',
locked: true,
}
// myDoor не будет видоизменяться (если мы будем придерживаться функционального подхода),
// поэтому мы получим новый объект "дверь", если мы откроем её
const myDoorOpened = open(myDoor)
И теперь, объектно-ориентированный:
// начнём с объекта дверь:
class Door {
constructor(color, locked) {
this.color = color
this.locked = locked
}
open() {
this.locked = false
}
}
// создадим новый объект "дверь"
const myDoor = new Door('red', true)
myDoor.locked // -> true
myDoor.open()
myDoor.locked // -> false
Итак, какие преимущества ФП мы можем здесь увидеть?
Дело не в том, что ООП плохо, проблема в том, что его очень легко испортить. С другой стороны, в функциональных языках просто сложнее писать плохой код.
Например в языке Elm, компилятор предупредит тебя [4], если ты забудешь о case в операторе switch. Функциональный стиль передаёт больше информации о цели программиста, поэтому среда разработки может работать с вами, почти как напарник программист.
Сообщество фронтенд разработчиков заинтересовалось функциональным программированием в 2016 году. Вот несколько интересных проектов, в которых можно найти примеры ФП:
Если ты хочешь окунуться в функциональное программирование, я бы посоветовал следующее:
И если ты из мира JavaScript:
Спасибо за чтение!
Если вы нашли какие то опечатки или есть предложения по переводу — прошу писать в личные сообщения.
Автор: vasya-ves
Источник [19]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/javascript/250053
Ссылки в тексте:
[1] здесь: https://habrahabr.ru/company/zfort/blog/323266/
[2] Ссылка на оригинал.: https://blog.daftcode.pl/get-functional-3eaceb76258f
[3] мозга: http://www.braintools.ru
[4] компилятор предупредит тебя: http://elm-lang.org/blog/compiler-errors-for-humans
[5] TypeScript: https://www.typescriptlang.org/
[6] Flow: https://flowtype.org/
[7] Ramda: http://ramdajs.com/
[8] Redux: http://redux.js.org/
[9] Elm: http://elm-lang.org/
[10] ClojureScript: https://clojurescript.org/
[11] PureScript: http://www.purescript.org/
[12] Исчерпывающее, но очень доступное введение в ФП: http://www.defmacro.org/ramblings/fp.html
[13] Руководство по функциональному программированию профессора Фрисби: https://drboolean.gitbooks.io/mostly-adequate-guide/
[14] Функциональный язык программирования: https://github.com/hemanth/functional-programming-jargon
[15] Мысли в Ramda: http://randycoulman.com/blog/categories/thinking-in-ramda/
[16] Потрясающее ФП JS : https://github.com/stoeffel/awesome-fp-js
[17] Что такое функциональное программирование: https://medium.com/javascript-scene/master-the-javascript-interview-what-is-functional-programming-7f218c68b3a0#.y8z71ghc5
[18] Эрика Эллиота: https://medium.com/@_ericelliott
[19] Источник: https://habrahabr.ru/post/324308/?utm_source=habrahabr&utm_medium=rss&utm_campaign=sandbox
Нажмите здесь для печати.