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

Это немного измененный объект из прошлой статьи.

И это будут функции, которые добавятся в список `favoriteFood`.

Итак... функция addFood выглядит немного переработанной, но! выслушай меня. Я знаю, что это много кода, но он не очень сложный и упростит всю программу. Странная аннотация, да. Я изучал Haskell, поэтому я использовал аннотацию типа Haskell, чтобы комментировать свой javascript. ржу не могу! Не волнуйтесь, это также не сложно, по крайней мере, не в моем примере.

Позвольте мне разобрать функцию `addFood()`.

Я упомянул ramda, я использую его вместо других библиотек, таких как Underscore.js или Lodash, потому что он делает каррирование и композицию более плавными, большинство функций в ramda правоассоциативны; это означает, что операции выполняются справа налево.

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

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

Функция редуктора также является одним из способов составления функций! В настоящее время наша функция редуктора имеет возможность «ADD_FOOD» для каждого объекта разработчика. Давайте добавим их любимый вкус мороженого!

Я извлек `favoriteFood()` из `addFood()` и преобразовал его в `addProps()`, потому что это была функция, которая может использоваться как для функций `iceCreamFlavor()`, так и для функций `addFood()`.

Вот все функции на данный момент:

Видите, как плавно все функции соединяются в функции редуктора?! Я думаю, можно с уверенностью сказать, что они прекрасно «скомпонованы» вместе!

Давайте проверим это!

Я использую набор тестов mocha и библиотеку утверждений chai для тестирования моего `reducer()`. Я импортировал `reducer()` в свою тестовую среду и передал в `initialState`,и передал действия в каждом тестовом блоке. . Затем я утверждаю результат этих действий с помощью expect. Как видите, мне нужно беспокоиться только о `initialState` и результате моего действия. Мне не нужно было беспокоиться о результирующем значении предыдущих операций. . Это то, что мне нравится в чистых функциях, они заботятся только о вводе, и после этого я могу предположить, что они вернут значение или результат операции, не затрагивая ничего вне функции. Прежде чем использовать чистые функции, я запускал свою программу, скрещивал пальцы (руки и ноги) и надеялся, что неожиданных изменений не произойдет. В моей программе было так много волшебства до появления чистых функций.

Вуаля! Результат моего теста:

В этой статье не пострадало ни одно государство.

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