Обзор функционального программирования

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

Это не так плохо, как кажется, если вы твердо придерживаетесь курса объектно-ориентированного программирования (ООП). Функциональное программирование сделало меня гораздо лучшим программистом. В случае, если вы не видите, как вы хоть немного покидаете мир ООП, необходимо прочитать эту замечательную статью, прежде чем двигаться дальше, чтобы понять общие точки преткновения чисто объектно-ориентированного подхода. Прочитав эту статью, я превратился из энтузиаста ООП в искреннее любопытство к функциональному программированию. Опыт работы с JavaScript заставил меня оценить мощь функций, которые я уже использовал в качестве обещаний и обратных вызовов еще во времена ES5.

Существует множество статей, в которых говорится о преимуществах функционального программирования, но большинство из них посвящено чисто функциональным языкам, таким как Haskell, Standard ML, Scheme или Erlang. Хотя многие из этих статей представляют собой введение в функциональное программирование, их подход был слишком теоретическим. Во время моего путешествия по функциональному программированию я хотел остаться в экосистеме JavaScript, потому что это то, с чем я был знаком, и я знал, что в JavaScript будет узел узла для любого вида функционального программирования. Я нашел что-то даже лучше! Практически полное руководство по функциональному программированию с использованием JavaScript. Не позволяйте названию обмануть вас. В книге даже признается уровень академической абсурдности, в который можно впасть с помощью функционального программирования. Вы даже можете уйти, прочитав только первую часть, чтобы действительно получить полное практическое представление о функциональном программировании.

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

Где Reactive появляется в функциональном программировании?

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

Что касается пользовательского интерфейса, несколько популярных библиотек JavaScript уже используют идеи функционального программирования. В Redux, например, состояние хранится как один неизменяемый объект. Редуктор, отвечающий за вычисление состояния, является самой инновационной частью Redux. Его создатель назвал на нем всю библиотеку. Неизменяемость обязательна в функциональном программировании и помогает решить огромное количество ошибок, связанных с асинхронными данными. Когда мы объединяем функциональное программирование с реактивной средой, такой как пользовательский интерфейс, эксперты-программисты начинают называть это функциональным реактивным программированием (FRP).

Еще одна функциональная библиотека JavaScript, популяризированная с помощью Angular, - это RxJS или, в более общем смысле, ReactiveX. В отличие от Redux, который представляет собой методологию программирования, ReactiveX - это полнофункциональная библиотека реактивного программирования, которая с годами стала более функциональной. Самое приятное то, что теперь он кроссплатформенный и доступен почти на всех языках. Он также имеет такое же соглашение об именах, как даже самые стойкие библиотеки функционального программирования на JavaScript, такие как Ramda (отображение, сокращение, фильтр и т. Д.).

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

Поскольку я столкнулся с RxJS через Angular, а также с программой с React, последние две версии (v5 и v6) были мне очень интересны, потому что они позволили RxJS стать кроссплатформенным в мире JavaScript. Теперь я мог использовать его везде. Они также выделили свои самые мощные операторы (по сути, чистые функции) в свою собственную папку. Это позволяет лучше понять, что делает каждая функция, и дает разработчикам очень мощный инструментарий для функционального программирования. Все эти операторы являются «конвейерными» и могут быть «каррированы» вместе для формирования функций более высокого порядка, которые можно многократно использовать.

Хотя научиться эффективно использовать RxJS отнюдь не легко, одной из самых мотивирующих вещей, которые поддерживали меня, были красочные диаграммы потоков и множество ресурсов, доступных для его изучения. Это было почти так, как если бы сообщество говорило: «Эй, мы знаем, что это сложные, но красочные картинки! Данные - это просто поток! » Затем все стало обретать смысл, и мое программирование стало намного более предсказуемым. Думая о данных как о потоке, который вы маршрутизируете с помощью таких функций, как map и filter, вы меняете свой стиль программирования. Вы организовываете свои файлы более осознанно. Вы можете начать писать более короткие блоки кода, которые делают гораздо больше, например однострочные циклы, которые фактически читаются с помощью «map».

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