DevGang
Авторизоваться

Что такое функциональное программирование? 

Изображение Aphinya Dechalert. Название: Робот хочет гамбол от функциональной машины.

Функциональное программирование существует намного дольше, чем объектно-ориентированное, начиная с древних времен машин Тьюринга. С течением времени оно стало популярным, основываясь на любом языке программирования и его основополагающих парадигмах, которые стали частью инструментария разработчика. Долгое время объектно-ориентированное мышление доминировало в сообществе. Это одна из первых вещей, которые преподаются в области компьютерных наук и о которых больше всего говорят, когда речь заходит об изучении программирования.

Куда бы вы ни пошли, все кажется объектом - за исключением того, что это не всегда так.

С ростом популярности JavaScript в качестве доминирующего языка в Интернете, функциональное программирование возвращается. В некоторой степени, JavaScript является языком, независимым от парадигмы, что означает, что он не сильно привязан к определенному способу программирования или мышления. Это также одна из причин, по которой он считается самым простым языком программирования для изучения. Вы можете приписать ему любую структуру или методы мышления, и это все равно будет работать.

Так что это возвращает меня назад, в чем же дело с функциональным программированием?

Они все просто шаблоны

По своей сути, программирование - это процесс уточнения бизнес-требований в четкие и краткие шаблоны, которые машины должны понимать и выполнять. Это также инструмент коммуникации между разработчиками на общем языке, который выходит за рамки местных диалектов. Кто-то, кто говорит по-немецки, теоретически должен уметь читать код, написанный кем-то, живущим в России.

Шаблоны облегчают этот процесс общения и являются способом думать, классифицировать и классифицировать все. Объектно-ориентированный подход - это часто тот, о котором учат и о котором говорят больше всего. Функциональное программирование часто отходит на второй план и на самом деле не привлекает внимание большинства людей.

Объектно-ориентированное, функциональное и процедурное программирование - это просто разные шаблоны написания кода. Некоторые языки программирования более дружественны к определенной парадигме, но это не делает их менее ценными для наших инструментов программирования.

Шаблоны решают определенный набор проблем, и со временем мы осознали и признаем, что не все является объектом, и могут быть более эффективные способы написания кода.

Понимание декларативных моделей

Есть два способа программирования - обязательно и декларативно. Императивное программирование сосредоточено на описании работы программы. По сути, это список команд для компьютеров. Это серия утверждений, которые выполняются по очереди. Вы не можете пропустить шаг, иначе дела идут плохо.

Старт.

Проверьте начальное состояние двери. 
Если дверь закрыта, возьмите и поверните ручку двери. 
Запомни новое состояние, иначе продолжай. 
Пройдите через дверной проем. 
Закрой дверь.

Конец.

В приведенном выше примере процесс должен быть завершен в точном порядке, иначе может произойти сбой.

Декларативный метод немного гибок в том смысле, что он работает, сообщая программе, чего она должна достичь, не указывая, как программа должна этого достичь. Функциональное программирование - это подкатегория декларативного стиля с инструкциями, которые могут выполняться в любом порядке, не нарушая программу.

Правила алгебры являются хорошим примером декларативного программирования при условии сохранения базовых правил вычисления.

1 + 2 + 3 + 4 + 5 = 15 
2 + 4 + 5 + 3 + 1 = 15

(3 x 5 x 8) + 12 - 5 + (2 x 5) = 137 
(5 x 2) - 5 + 12 + (5 x 3 x 8) = 137

Другой способ понять декларативное программирование состоит в том, что оно существует для решения конкретной проблемы путем преобразования ввода в ожидаемый вывод, независимо от того, каким может быть этот ввод и как этот ввод обрабатывается.

Проблема: я хочу изменить это существо (входную) курицу в (выходную) корову.

Применить 4 ноги
Удлинить ноги
Снимите наружное покрытие и замените на белую коровью шкуру
Дайте существу черные пятна
Увеличение размера существа
Измените шум на "му"
Измените лицо существа и замените на морду коровы

Прощай, состояние!

В функциональном программировании JavaScript состояние не является частью уравнения и, следовательно, уменьшает уровень сложности, сосредотачиваясь только на том, что ему дано и как его обработать.

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

Давайте быстро взглянем на код ниже.

let ticketSales = [
   {name:'Twenty One Pilots', isActive: true, tickets:430}, 
   {name:'The Wiggles Reunion', isActive: true, tickets:257},
   {name:'Elton John', isActive: false, tickets:670}
]

/* используя императив */
let activeConcerts = [];
for (let i = 0; i < ticketSales.length; i++) {
    let t = ticketSales[i]; 
    if(t.isActive) { 
        activeConcerts.push(t)
    }
}

При использовании императивного шаблона существует точная процедура, которую должна выполнить программа для получения правильного вывода. Язык кода сфокусирован на описании того, как все работает, а не на том, что он должен выполнить. Для работы требуется состояние i, и если оно каким-то образом изменено и выходит за пределы диапазона, существует высокая вероятность неправильного вывода.

/* используем декларативный стиль кодирования, с тем же набором данных */
let activeConcerts = [];
activeConcerts = (ticketSales.filter((t) => {
   return t.isActive;
}))

Оба примера используют один и тот же набор данных, но обрабатывают его по-разному. В JavaScript существует несколько методов массива, которые позволяют функциональное программирование (find, map, reduce, every, some) возможно и, следовательно, уменьшить общую сложность кода.

Заключительные слова

Хотя статья охватывает только основы функционального программирования, она не является окончательным руководством.

При изучении ФП многие люди сразу же сталкиваются с техническими особенностями, а не с идеологией. Функциональное программирование - это шаблон и способ написания кода, который не привязан к установленной процедуре, которая может вызвать ошибки, если что-то пошло не так. После правильного понимания функциональные шаблоны могут применяться внутри объектно-ориентированных шаблонов.

Темы в функциональном программировании, которые требуют дальнейшего обсуждения, включают в себя, но не ограничиваются ими, неизменность, наблюдение, ссылочную прозрачность, первоклассные объекты, функции высшего порядка, фильтры, отображение и уменьшение - вот некоторые из многих вещей.

В конце концов, все в программировании - это шаблон. Расширение ваших знаний за пределы одной парадигмы дает вам больше инструментов для работы, когда дело доходит до эффективного и действенного решения проблем.

Перевод статьи: What exactly is functional programming?

Комментарии
Чтобы оставить комментарий, необходимо авторизоваться

Присоединяйся в тусовку

Поделитесь своим опытом, расскажите о новом инструменте, библиотеке или фреймворке. Для этого не обязательно становится постоянным автором.

Попробовать

Оплатив хостинг 25$ в подарок вы получите 100$ на счет

Получить