если вы один из тех людей, которые увлекаются JS (и не начинают сразу с React ;-) ), то вы наверняка наткнулись на понятие «функциональное программирование».

Может быть, вы только что слышали эту концепцию как сексуальное модное словечко и предположили — конечно, функциональное программирование, когда я пишу функции. Это даже не неправильно — конечно, функциональное программирование — это функции. Но концепция намного шире и включает в себя нечто большее.

Почему вы должны использовать его?

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

Это зависит от вас, конечно. Для меня, хотя мне нравится объектно-ориентированное программирование на Java или Python, функциональное программирование просто проще, менее сложно, его легче поддерживать и оно менее запутанно, чем объектно-ориентированное программирование на JS.

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

Функциональное программирование — это стиль программирования, в котором решения представляют собой простые изолированные функции без каких-либо побочных эффектов за пределами области действия функции: INPUT -> PROCESS -> OUTPUT

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

Функциональное программирование — это форма декларативного программирования. Вы сообщаете компьютеру, что вы хотите сделать, вызывая метод или функцию.

О чем вы должны были слышать:

  1. Чистые функции

Вы, конечно, слышали о побочных эффектах, и некоторые из них вы использовали преднамеренно. Побочные эффекты — это то, что делают функции, даже если это не то, что они должны делать.

Это часто приводит к тому, что очень трудно найти ошибки, особенно по мере того, как ваши проекты становятся больше. Вот супер простой пример:

Выход:

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

Чтобы предотвратить это, в функциональном программировании мы стараемся использовать «чистые функции».

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

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

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

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

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

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

2. Обратные вызовы

Обратные вызовы — это функции, которые проскальзывают или передаются в другую функцию.

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

Функции, которые принимают функцию в качестве аргумента или возвращают функцию в качестве возвращаемого значения, называются функциями высшего порядка.

Не вмешивайтесь! Использовать уменьшение, фильтр карты

Если вы изучаете программирование, вы наверняка знаете о циклах for или while. Эти концепции важны, но мы не используем их в функциональном программировании.

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

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

Без использования функции высшего порядка:

С функцией высшего порядка: «Фильтр»

Если вы хотите знать точные функциональные возможности карты, сокращения и фильтрации, то Google — ваш друг. Но классическим объяснением концепции, конечно же, является Map-Reduce Sandwich.

Не изменяйте свои данные

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

Чтобы избежать этих проблем с эффективностью, мы используем постоянные структуры данных в функциональном стиле.

Это основано на концепции sструктурного совместного использования и означает, что вы делитесь частями старой версии for ex. ваш массив с новой версией.

Для использования этого в JS есть несколько известных библиотек, например immutable.js.

Все ясно?

Если да, отлично! Если вы хотите узнать больше: есть отличное сообщество и много информации в Интернете, например: