С объектами, классами и функциональным программированием
В этой статье я предполагаю, что вы знаете, что такое Redux и что делают редукторы.
Я расскажу, как улучшить ваши редюсеры Redux, сделав их быстрее, и как избежать предупреждения / ошибки цикломатической сложности, которые могут возникнуть с чем-то вроде SonarQube при увеличении количества действий.
Ниже приведен простой switch
оператор, который вы, вероятно, видели в 99% примеров Redux / reducer.
Мы собираемся улучшить его, используя dictionary
.
Словарь (пара "ключ-значение")
dictionary
- это простой объект JavaScript, в который вы можете добавить строковое значение в качестве ключа и присвоить ему значение.
Ниже представлена упрощенная версия того, что мы собираемся создать. Обратите внимание, что ключ - это имя действия type
, а назначенное значение - это функция, которая принимает текущее состояние и полезную нагрузку в качестве аргументов для создания нового состояния.
Функциональный подход JavaScript
Давайте улучшим пример словаря, создав функцию baseReducer
, которая принимает initialState
в качестве первого аргумента и словарь в качестве второго аргумента.
Надеюсь, приведенный ниже код легко читать / понимать, но в основном мы используем константу типа действия в качестве имени функции.
В приведенном выше коде параметр reducerDictionary
- это словарь, который был передан. Обратите внимание, как здесь используется action.type
, reducer[action.type]
, чтобы получить доступ к правильной функции редуктора.
Подход класса JavaScript
Давайте улучшим пример словаря, создав класс BaseReducer
для расширения наших редукторов классов.
Обратите внимание на то, как ShowsReducer
extends
BaseReducer
. Это наследование, которое абстрагирует часть логики до другого класса, поэтому редукторы имеют только необходимое.
Если вы посмотрите на BaseReducer
выше, вы увидите:
Line 2
:initialState
, который будет переопределен, когда класс редуктора расширяет этоBaseReducer
.Line 4
: Метод редуктора, который будет использоваться Redux.Line 5
: получает доступ к методу класса, соответствующемуaction.type
.Line 7
: если метод не найден (!method
) или действие является ошибкой (action.error
), возвращается текущийstate
.Line 11
: вызывает найденный метод с аргументамиstate
иaction
, которые возвращают измененныйstate
, который будет использовать Redux.
Примеры кода
Если вы хотите увидеть эти примеры кода в действии, ознакомьтесь с другой моей статьей, посвященной образцу приложения и исходному коду как для функционального, так и для базового подхода. У меня тоже есть версии TypeScript!