В своей предыдущей статье я говорил о чистых функциях и функции-редьюсере из 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` и результате моего действия. Мне не нужно было беспокоиться о результирующем значении предыдущих операций. . Это то, что мне нравится в чистых функциях, они заботятся только о вводе, и после этого я могу предположить, что они вернут значение или результат операции, не затрагивая ничего вне функции. Прежде чем использовать чистые функции, я запускал свою программу, скрещивал пальцы (руки и ноги) и надеялся, что неожиданных изменений не произойдет. В моей программе было так много волшебства до появления чистых функций.
Вуаля! Результат моего теста:
В этой статье не пострадало ни одно государство.
Я просто хочу повторить, что я не эксперт в этом вопросе, я просто констатирую преимущества того, что я узнал. Я надеюсь, что это было достаточно связно для тех, кто читает это. Если вы хотите узнать больше, посмотрите Эрик Эллиот!