если вы один из тех людей, которые увлекаются JS (и не начинают сразу с React ;-) ), то вы наверняка наткнулись на понятие «функциональное программирование».
Может быть, вы только что слышали эту концепцию как сексуальное модное словечко и предположили — конечно, функциональное программирование, когда я пишу функции. Это даже не неправильно — конечно, функциональное программирование — это функции. Но концепция намного шире и включает в себя нечто большее.
Почему вы должны использовать его?
Во-первых, зачем вам этим заниматься и как вам поможет функциональное программирование?
Это зависит от вас, конечно. Для меня, хотя мне нравится объектно-ориентированное программирование на Java или Python, функциональное программирование просто проще, менее сложно, его легче поддерживать и оно менее запутанно, чем объектно-ориентированное программирование на JS.
Что такое функциональное программирование?
Функциональное программирование — это стиль программирования, в котором решения представляют собой простые изолированные функции без каких-либо побочных эффектов за пределами области действия функции: INPUT -> PROCESS -> OUTPUT
Проще говоря, в функциональном программировании вы мыслите с точки зрения потока данных, ввода -> вывода, а не объектов и взаимодействий между ними.
Функциональное программирование — это форма декларативного программирования. Вы сообщаете компьютеру, что вы хотите сделать, вызывая метод или функцию.
О чем вы должны были слышать:
- Чистые функции
Вы, конечно, слышали о побочных эффектах, и некоторые из них вы использовали преднамеренно. Побочные эффекты — это то, что делают функции, даже если это не то, что они должны делать.
Это часто приводит к тому, что очень трудно найти ошибки, особенно по мере того, как ваши проекты становятся больше. Вот супер простой пример:
Выход:
Мы случайно удалили Дава и Рене из нашего глобального списка учащихся. Это побочный эффект вставки, поскольку вставка также изменяет переменную.
Чтобы предотвратить это, в функциональном программировании мы стараемся использовать «чистые функции».
Чистые функции означают, что функция вычисляет свои выходные данные на основе своих входных данных и не вычисляет их на основе глобальной переменной, не определенной в области действия функции.
Это означает, что вы всегда объявляете свои зависимости явно. Если функция зависит от наличия переменной или объекта, передайте эту переменную или объект непосредственно в функцию в качестве аргумента.
Из этого принципа вытекает несколько хороших следствий. Функцию легче тестировать, вы точно знаете, какие входные данные она принимает, и она не будет зависеть ни от чего другого в вашей программе.
Это может дать вам больше уверенности при изменении, удалении или добавлении нового кода. Вы бы знали, что вы можете или не можете изменить, и вы могли бы видеть, где находятся потенциальные ловушки.
Подумайте, как вы могли бы это сделать в приведенном выше примере.
Чтобы не сбивать вас с толку, я пока оставлю это объяснение. Проще говоря: в функциональном программировании вам не нужно ничего, кроме того, чтобы ваша функция вычисляла свои выходные данные на основе своих входных данных.
2. Обратные вызовы
Обратные вызовы — это функции, которые проскальзывают или передаются в другую функцию.
Функции, которые могут быть присвоены переменной, переданы в другую функцию или возвращены из другой функции, как и любое другое нормальное значение, называются первоклассными функциями.
Функции, которые принимают функцию в качестве аргумента или возвращают функцию в качестве возвращаемого значения, называются функциями высшего порядка.
Не вмешивайтесь! Использовать уменьшение, фильтр карты
Если вы изучаете программирование, вы наверняка знаете о циклах for или while. Эти концепции важны, но мы не используем их в функциональном программировании.
В функциональном стиле вместо этого мы используем функции высшего порядка, если вы снова забыли, что это такое, посмотрите на несколько строк выше. Наиболее важными функциями являются: сопоставление, фильтрация и уменьшение.
Эти функции являются функциями высшего порядка, потому что они принимают в качестве аргумента не только список, который вы хотите изменить, но и функцию.
Без использования функции высшего порядка:
С функцией высшего порядка: «Фильтр»
Если вы хотите знать точные функциональные возможности карты, сокращения и фильтрации, то Google — ваш друг. Но классическим объяснением концепции, конечно же, является Map-Reduce Sandwich.
Не изменяйте свои данные
Как уже упоминалось, в функциональном стиле мы не меняем существующие данные. Теперь это может показаться неэффективным, и в некоторых случаях это действительно так, потому что вы создаете копии своих данных. НО этот подход также избавит вас от головной боли при поиске ошибок в вашем коде.
Чтобы избежать этих проблем с эффективностью, мы используем постоянные структуры данных в функциональном стиле.
Это основано на концепции sструктурного совместного использования и означает, что вы делитесь частями старой версии for ex. ваш массив с новой версией.
Для использования этого в JS есть несколько известных библиотек, например immutable.js.
Все ясно?
Если да, отлично! Если вы хотите узнать больше: есть отличное сообщество и много информации в Интернете, например: