Найти тему
JavaСкриптизёр

Функциональное программирование на JS

Оглавление

Введение в увлекательный мир функционального программирования на JavaScript.

Функциональное программирование JavaScript
Функциональное программирование JavaScript

Функциональное программирование (ФП) - это парадигма программирования, в которой мы рассматриваем код как функцию. Как же увлекательно то, что всё - это функция. Функциональное программирование - не новая концепция, но она набирает популярность. Даже объектно-ориентированные языки программирования пытаются привнести в себя функциональные концепции. Например: лямбда-функции в Java.

Функциональное программирование немного отличается от обычно наблюдаемого объектно-ориентированного программирования. В функциональном программировании используются различные шаблоны и концепции, что дает ему уникальный подход к решению проблем. Различные языки программирования являются чисто функциональными, например, Elixir, Haskell, Clojure и Scala, тогда как существуют языки программирования, которые черпают вдохновение или функциональные концепции из чисто функциональных языков, такие как Javascript, Python или Ruby.

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

Итак, давайте погрузимся в концепции функционального программирования.

Функции высшего порядка

Функции высшего порядка в JavaScript
Функции высшего порядка в JavaScript

Функции высшего порядка ( Higher-order function ) - одна из фундаментальных концепций, используемых в функциональном программировании. Функция, которая принимает функцию в качестве аргумента или возвращает функцию, называется функцией высшего порядка. Для понимания функций высшего порядка нам сначала нужно понять, что такое функции первого класса.

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

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

  • Объявление функций ( Function Statements )
  • Функциональное выражение ( Function Expressions )

Объявление функций

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

Функциональное выражение

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

Рассмотрев концепции функций первого класса, мы теперь можем легко понять функции высшего порядка.

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

В приведенном выше примере функциональное выражение greet передается в качестве параметра функции sayGreetings(). Используя это, мы можем получить функциональность функции greet и добавить нашу логику к функции sayGreetings(). Это похоже на расширение возможностей одной функции и повышение ее ценности. В приведенном выше примере в качестве аргумента передавалась функция.

В приведенном выше примере greeting() - это функция высшего порядка. Когда вызывается функция greeting(), она, в свою очередь, возвращает другую функцию. Внутренняя функция - это анонимная функция, которая выводит Hello! в консоль. Когда вызывается greetings(), он возвращает внутреннюю функцию, которая хранится в переменной с именем greet, эта переменная теперь является функциональным выражением, которое содержит внутреннюю анонимную функцию greetings().

Функции высшего порядка помогают нам писать эффективный и чистый код, используя концепции функционального программирования. Существуют различные встроенные функции, которые на самом деле являются функциями высшего порядка, например, функции map() и filter(). Эти функции присутствуют в прототипе Array.

Обратите внимание, как функция map() принимает анонимную функцию, которая принимает все элементы в массиве и возвращает удвоенное значение каждого элемента. Поскольку она принимает функцию в качестве аргумента, мы можем сказать, что это функция более высшего порядка.

Фабричные функции

Фабричные функции ( Function factories ) - это функции, возвращающие объект. Это не класс или конструктор, это функция, которая возвращает или создает объект. Каждая функция в javascript может возвращать объект, но функции, которые создают объекты без использования ключевого слова new, являются фабричными функциями. Фабричные функции могут быть функциями высшего порядка, которые принимают функцию и возвращают объект.

В приведенном выше примере показано, как функциональное выражение user возвращает объект пользователя.

Каррирование функций

Каррирование функций ( Function curring ) - один из шаблонов, широко используемых в языках функционального программирования. Хотя мы можем легко реализовать каррирование функций в Javascript, Elixir относится к языкам программирования, каррирование функций которых, я бы сказал, чище, чем любой другой язык. Однако мы можем реализовать каррирование функций с помощью bind ().

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

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

Неизменяемость

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

В javascript неизменяемость достигается с помощью ключевого слова const. Переменные, определенные с помощью ключевых слов const, являются неизменяемыми константами.

В Javascript использование const при объявлении выражения функции является одним из наиболее распространенных шаблонов и обеспечивает неизменяемость.

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

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

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

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

Рекурсия

Рекурсия ( Recursion ) - одна из ключевых тем или шаблонов, используемых в функциональном программировании. Рекурсия - это процесс, в котором функция вызывает себя снова и снова внутри своего определения функции, пока не остановится. Рекурсия часто является лучшим вариантом по сравнению с циклом, поскольку она добавляет ясности и сокращает время, необходимое для написания и отладки кода. Например она лучше для обхода дерева. Ряд Фибоначчи - один из классических примеров рекурсивных функций.

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

Заключение

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

Спасибо за просмотр!

Если вам понравилась статья - можете оценить её и написать комментарий внизу, высказав своё мнения по поводу функционального программирования в JS.

Если вы хотите видеть больше интересного контента по JavaScript, то приглашаю вас перейти на мой канал и посмотреть больше статей, а если вам понравится, то подписаться, чтобы не пропускать новых.

Всего доброго;)