Что общего у JavaScript с парадигмой функционального программирования

Функциональное программирование (FP) стало очень популярным в последнее десятилетие веб-разработки. Благодаря множеству библиотек и фреймворков (LoDash, RamdaJS, React и Redux, Angular и NGRX) JavaScript получил отличные черты FP.

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

Тем не менее, JavaScript предлагает множество функций, которые поднимают вопрос:

Подходит ли JavaScript для FP?

Различные мнения о функциональном программировании

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

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

Я думаю, что правда где-то внутри, как и все в жизни. Нет ничего просто черного или белого.

Думайте иначе

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

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

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

Содержание вашего набора инструментов

Что нужно языку, чтобы стать функциональным языком?

Можете ли вы использовать прекрасный английский способ кодирования, если JavaScript предлагает нам столько, сколько нам нужно?

Если вам не разрешено использовать циклы, что еще вам следует использовать? Рекурсия.

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

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

Вообще говоря, JavaScript должен позволять писать код следующими способами:

Модульный, понятный, тестируемый, расширяемый, многоразовый

Модульный

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

Понятный

С легкостью прочтите свой код и быстро поймите, что он делает. Он должен читаться как отрывок из текста этой статьи. Таким образом, ремонтопригодность тесно связана с этим термином.

Проверяемый

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

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

Расширяемый

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

Многоразовый

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

Следовательно, этот способ программирования фокусируется на что следует делать, а не на как.

Что принесла вам FP

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

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

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

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

Наконец: работает ли JavaScript?

Кратко отвечу: Да, нет, может быть, не знаю!

«Нет точного определения для языков программирования FP или точного набора функций, которые такие языки должны включать ...» - Фредерико Кереки

Если у языка есть общие стили и функциональность, которые рассматриваются с FP, он, по крайней мере, поддерживает функциональное программирование и может быть завершен с помощью SFP (Sorta Functional Programming).

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

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

Академические требования 🌬 Лучшее из обоих

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

Подумайте о 100% функциональности и о преимуществах, которые вы получите от этого? Стоит ли опускать полезные конструкции JS, которые мешают вам добиться 100% FP?

На мой взгляд, нет.

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

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

JavaScript предлагает вам множество важных функций для функционального кода, например следующие:

  • Функции как первоклассные объекты
  • Рекурсия
  • Стрелочные функции
  • Закрытие
  • Распространять

Возникает вопрос: почему вы должны их опускать?

Практического ответа нет. Используй их.

Воспользуйтесь преимуществами функций FP и уменьшите проблемы, вызываемые классическими частями JavaScript, такими как побочные эффекты, изменяемые объекты и практические ограничения рекурсии.

Это полностью зависит от вас, насколько функциональным будет или не будет JavaScript.

Последнее слово: FP - это не ключ к раю

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

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

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

Не пропускайте структуры и функции JavaScript только потому, что они не на 100% функциональны.

Ваша цель - использовать FP для упрощения кода, а не чрезмерного его усложнения.

Прохождение курса программирования кажется безличным, правда? Как будто вас оставили наедине с задачей написать код. Что ж, я возьму вас за руку и передам вам знания, переплетенные с эмоциями, весельем и замечательным и уникальным стилем преподавания. С моей Академией ArnoldCode ты никогда не один.

использованная литература