Функциональное программирование (ФП) обладает целым набором особенностей и преимуществ. В этой статье вы узнаете о них.
На чем основано ФП?
Система функционального программирования базируется на трех концепциях. У каждой из них есть важные аспекты, которые мы рекомендуем изучить. Ниже коротко разберем каждую концепцию. Это позволит вам понять принципы функционального программирования.
Что такое чистые функции?
Суть концепции несложная. Чистая функция — предсказуемая. После каждого вызова она выдает одинаковый результат. Разберем небольшой пример на JS:
var a = 5;
function sum(b, c) {
return b + c;
}
Данный пример искусственный. Однако он наглядно демонстрирует, каким образом работает чистая функция. При одном и том же значении b и c вы всегда получите идентичный результат. Пользуясь этим принципом, вы сможете писать более чистый и легко читаемый код. А после внесения каких-либо правок в него программа продолжит работать нормально.
Данные и побочные эффекты
Рассмотрим еще раз пример выше. Если поместить в аргумент sum(), a — переобъявленную, объявленную выше, функция уже не будет чистой. Это связано с тем, что a — самая обычная переменная. Есть возможность менять ее значение в любой части программы.
Неизменяемость в ФП состоит в том, что после объявления переменные нельзя изменять. Правильный пример кода функции с a будет выглядеть таким образом:
const b = 5;
const a = 5;
sum(b, a); // функция вернет 10
Функц. во всех случаях выдает ожидаемое значение. Если этого не будет, могут появиться побочные эффекты.
Рассмотрим еще пример. Цикл for в JS имеет следующий вид:
var cout = 0;
for (var j = 1; j <= 20; ++j) {
cout += i;
}
console.log(cout); // ответ: 210
Необходимо понимать, что цикл применяет переменную j для вычисления шагов. В ФП применение этого цикла считается некорректным, поскольку может вызвать некорректную работу цикла.
Чтобы не допустить возникновения негативных эффектов, необходимо применять рекурсивные функции при написании кода циклов.
function addRange(st, en, count) {
if (st > en) {
return count;
} else {
return addRange(st + 1, en, count + st);
}
}
console.log(addRange(1, 20, 0)); // ответ: 210
Код дает возможность применять константы для шага цикла, его начала и конца. В фундаменте циклов этого типа находится идея о том, что функцию можно вызывать внутри себя. В коде выше addRange() с указанными аргументами тестирует условия. Если результат ложный, она модифицирует их, и вызывает себя снова.
Что такое композиция функций?
Метод, основанный на вызове одних функц. в роли аргументов иных, для формирования составных функц. из простых получил название композиции.
function add1(a) {
return a + 1;
}
function times2(a) {
return a * 3; }
console.log(add1(times2(3))); // ответ: 7
console.log(times2(add1(3))); // ответ: 8
В коде выше есть две простые функц.: add1 и times2. Первая добавляет к аргументу 1, а вторая умножает его на три. Методика компоновки дает возможность нам вызывать каждую из этих функц. друг в друге. В итоге внесение различных изменений в порядок вызова, а также другие составляющие будет приносить ожидаемый результат.
Плюсы
Применяя ФП, вы сможете сделать свой код чистым, и легко читаемым. Применение его принципов позволит устранить излишние абстракции, выдающие непредсказуемый результат. В итоге ваши программы станут логичней, и будут работать эффективней. Кроме того, этот метод позволяет снизить число возникающих в ходе разработки ошибок.
Минусы
ФП не очень хорошо подходит для алгоритмов, базирующихся на графах из-за относительной медлительности программы. Оно не подходит для использования в решениях, основанных на применении императивной методики.
В функциональных языках отсутствует удобный неупорядоченный словарь множества. Функциональные словари показывают намного более слабую эффективность относительно хэш-таблиц. Для некоторых программ это критично. При этом отметим, что перечисленные недостатки относятся исключительно к императивным языкам.
Функциональные языки
Следует понимать, что ФП представляет собой подход к написанию кода. Поэтому его можно применять для работы с любыми языками. При этом есть языки, которые были специально разработаны для использования этого подхода. Например, Lisp. Его разработал Джон Маккарти. Именно ему принадлежит термин AI. Разработанный им язык до сих пор применяют программисты, занимающиеся проектированием искусственного интеллекта.
Приведем еще примеры: Elm и Elixir. Это функциональные языки программирования. При этом их востребованность увеличивается. Популяризация JS привела к росту востребованности концепции ФП в рамках этого языка. Основы функционального программирования вы сможете изучить на курсах DevEducation.