Это вторая статья из серии Практический функциональный JavaScript.
[Предыдущая | Следующий ].

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

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

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

Если вы помните иллюстрацию Pure Function из нашей первой статьи (Шаг 1), мы можем расширить этот блок, чтобы представить реальный сценарий, когда функция вызывает другие функции для достижения своих собственных результатов.

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

«Простота - ключ к надежности». - Дейкстра

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

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

Чтобы рассуждать или думать о приложении как о серии преобразований данных, нам нужно начать делать маленькие шаги в этом направлении. Лучше всего начать с Arrays, потому что у него есть три мощных метода: map (), reduce () и filter (), которые помогают нам видеть, как входные данные преобразуются через конвейер функций.

Карта()

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

Пример: список чисел в список квадратов этих чисел

[1, 2, 3, 4, 5] .map (a = ›a * a); // произведет [1, 4, 9, 16, 25]

Уменьшать()

Вы обрабатываете все значения из списка в одно значение.

Пример: список чисел для суммы этих чисел

[1, 2, 3, 4, 5] .reduce ((a, b) = ›a + b); // произведет 15

Фильтр()

Вы извлекаете значения из списка в другой (более короткий) список на основе некоторых критериев для отдельных значений в исходном списке.

Пример: список чисел в список только четных чисел

[1, 2, 3, 4, 5] .filter (a = ›a% 2 === 0); // произведет [2, 4]

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

Несколько быстрых примеров:

Из отчета о продажах выберите для отображения продажи «Дэйва Ноя» за ноябрь. Также отобразите совокупную сумму продаж для выбранных записей.

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

Первое, что мы видим, применяя эти функции высшего порядка в вышеупомянутом решении, - это красота, которую оно привносит в поток кода. Это кратко и ясно. В противном случае нам потребуется пустой массив для начала, который будет вставлен с номерами номеров во внутреннем forEach, перебирая автомобили внутри внешнего forEach перебирать сотрудников. Приведенный выше код делает то же самое, но чисто функционально = ›Неизменяемость + Функции высшего порядка.

Использование reduce (), вероятно, будет уловкой и сердцем решения. Нам нужно заняться подобной практикой и настроить решение, чтобы применить комбинацию map / filter / reduce. Двери в мир функционального программирования открываются мышлением неизменяемости.

Забрать

  1. Если ваша структура данных не является списком, попробуйте преобразовать ее в список; так что мощность map / reduce / filter может быть применена к вашему решению
  2. Остановите использование g for (), for-in () или forEach (); все они в конечном итоге приводят к мутациям. Шаг 1 всегда на первом месте - думайте о неизменяемости и чистых функциях. Некоторые методы Array () изменяют исходное состояние (алгоритм на месте), например. splice (), push () и т. д .; держись подальше. Используйте методы Array (), которые возвращают новый экземпляр Array (), например. concat (), slice () и т. д.
  3. Настройте свое решение вокруг map () / filter () / reduce ()

Практикуйте это несколько дней, прежде чем переходить к следующему шагу.

Узнать больше