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

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

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

Начиная

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

Как указывалось ранее, функциональное программирование разбивает код на составные детерминированные функции. Давайте посмотрим, что это на самом деле означает:

Составные:

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

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

Детерминированный:

Детерминированная система - это система, в которой случайность не участвует в развитии будущих состояний системы. Таким образом, детерминированная модель всегда будет давать один и тот же результат из заданного начального условия или начального состояния.

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

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

Как это выглядит?

Так как же это на самом деле выглядит? Давайте разберем это ниже с двумя функциями, double и square.

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

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

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

Пока функция compose каррирована (как в приведенном выше примере), мы можем переписать ее, используя синтаксис без точек, например:

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

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

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

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

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

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

Рекурсия

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

Например:

Становится:

Библиотеки функционального программирования

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

Мой личный фаворит и тот, который пользуется популярностью в сообществе, - это Ramda. Ознакомьтесь с документацией Ramda API для примера использования.

Что дальше

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

Ресурсы

Вот несколько замечательных ресурсов по функциональному программированию:

Если вам понравилось это читать, мы будем рады услышать от вас. И, кстати, мы расширяем нашу команду разработчиков и разработчиков! Если вы увлечены созданием передового потребительского опыта и масштабируемых решений, присоединяйтесь к нам, посетив https://www.beamly.com/#section-join-us.