Почему государственные функции Redux называются редукторами?
Это часть официальная документация Redux:
это называется редуктором, потому что это тип функции, которую вы бы передали
кArray.prototype.reduce(reducer, ?initialValue)
это не имеет большого смысла для меня. Может кто-нибудь объяснить мне, почему они на самом деле называются редукторами? Тот факт, что они возвращают значение по умолчанию (или у них есть значение аргумента по умолчанию), не делает их редукторами IMHO.
9 ответов:
тот факт, что они возвращают значение по умолчанию (или у них есть значение по умолчанию значение аргумента) не делает их редукторами IMHO.
редукторы не просто вернуть значения по умолчанию. Они всегда возвращают накопленное состояние (исходя из всех предыдущих и текущих действий).
поэтому они действуют как редуктор государства. Каждый раз, когда вызывается редуктор redux, состояние передается с действием
(state, action). Это состояние тогда уменьшенный (или накопленный) на основе действия, а затем возвращается следующее состояние. Это один цикл классическогоfoldили
если вы считаете, что серия действий в вашем приложении похожа на список или, возможно, больше похожа на поток, это может иметь больше смысла.
возьмите этот пример:
['apple', 'banana', 'cherry'].reduce((acc, item) => acc + item.length, 0)первый аргумент является функцией вида
(Int, String) => Int. Вместе с начальным значением вы передаетеreduceчто можно было бы назвать "функцией редуктора", и вы получите результат обработки ряда элементов. Таким образом, вы можете сказать, что функция редуктора описывает, что делается с каждым последующим отдельный элемент для изменения результата. Другими словами, функция редуктора принимает предыдущий выход и следующее значение, и она вычисляет следующий выход.это аналогично тому, что делает редуктор Redux: он принимает предыдущее состояние и текущее действие, и он вычисляет следующее состояние.
в истинном функциональном стиле программирования вы можете концептуально стереть значение, примененное к аргументам и результату, и просто сосредоточиться на "форме" входных данных и выход.
на практике редукторы Redux обычно ортогональны в том смысле, что для данного действия они не все изменяют одни и те же свойства, что позволяет легко разделить их обязанности и агрегировать выходные данные с
combineReducers.
Как уже упоминалось название связано с понятием редуктора в функциональном программировании. Вы также можете найти определение словаря Merriam-Webster редуктора полезным:
1a. чтобы свести вместе или заставить сходиться: консолидировать (свести все вопросы к одному)
редуктор объединяет действия в один объект, представляющий состояние приложения.
причина, почему a редуктор redux называется a
reducerЭто потому, что вы могли бы "уменьшить" acollection of actionsиinitial state(магазина), на котором нужно выполнить эти действия, чтобы получить в результатеfinal state.как? Чтобы ответить на это, позвольте мне снова определить редуктор:
The уменьшить() метод применяет a
function (reducer)Сaccumulatorи каждый значение массива (слева направо), чтобы уменьшить его до одного значение.и что делает редуктор redux?
редуктор чистый
function, которая принимает текущее состояние и действия, и возвращает следующее состояние. Обратите внимание, что состояниеaccumulatedпоскольку каждое действие в коллекции применяется для изменения этого состояния.таким образом, данный
collection of actions, редуктор применяется к каждому значению коллекции (слева направо). В первый раз, он возвращаетinitial value. Теперь применяется редуктор снова об этом начальном состоянии и первом действии, чтобы вернуть следующее состояние. И следующий элемент коллекции (действие) применяется каждый раз наcurrent stateдля полученияnext stateпока он не достигнет конца массива. И тогда, вы получитеthe final state. Как это круто!
автор считает состояние аккумулятором функции уменьшения. Например:
Final State = [Action1, Action2, ..., ActionN].reduce(reducer, Initial State);функция уменьшения приходит от функционального программирования, имя "редуктор" также приходит от ФП.
мне не нравится это имя здесь. Потому что я не вижу мир как результат одного значения после действий. Государство здесь-это объект. Например:
['eat', 'sleep'] === [addTodo('eat'), addTodo('sleep')].reduce(reducer, []);этой редуктор не уменьшает ничего вообще. И мне все равно, уменьшит он что-нибудь или нет. Называя его как датчик будет иметь больше смысла.
мы знаем, откуда берутся редукторы (функциональное программирование), и почему они могут считаться выполняющими сокращающую работу (уменьшите N входных элементов до одного возвращаемого значения - это именно то, что обычные функции поддерживаются). Однако: имя-это просто имя, как роза-это имя для розы. Не думай слишком много. Redux progammers-это люди, они заблокированы в своем контексте, и там это имеет смысл. Остальные из нас должны принять право изобретателя называть голубую собаку а желтый кот ;-)
другие ответы хорошо объясняют, почему он называется так, как есть, но давайте попробуем назвать больше вещей...
const origState = 0; const actionOperators = { increment: (origState) => origState++, decrement: (origState) => origState--, }; const anOperator = (aState, anAction) => actionOperators[anAction](aState); const actions = ['increment', 'decrement', 'increment']; const finalState = actions.reduce(anOperator, origState);первый,
reduceможно назватьuse anOperator with every action name and accumulated state, starting with origState. В smalltalk это называетсяactions inject: origState into: anOperator. Но что на самом деле вы вводите в оператора? Исходное состояние и имена действий. Поэтому даже в Smalltalk имена методов не очень понятны.
actionOperators[increment]это редуктор, но я бы скорее назвал его и actionOperator, потому что он реализован для каждого действия. Государство-это просто аргумент (и еще один в качестве возвращаемого значения).редуктор, однако, лучше слово, чтобы быть на вершине результатов поиска google. Это также похоже на Redux.
Я не мог понять, как редуктор Redux напрямую сопоставляется с функцией, которую вы используете с
reduce, Так что вот несколько примеров, чтобы увидеть, как они совпадают.сначала стандартный редуктор (называемый "аккумулятор" в MDN) функция от массив MDN.уменьшить документация, а затем упрощенный пример Дана Абрамова
Counter.jsв конце ' Вам может не понадобиться Redux ' сообщение в блоге.const sum = function(acc, val) { return acc + val; }; console.log([0, 1, 2, 3].reduce(sum, 0)); // 6 const reducer = function(state, action) { switch (action) { case 'INCREMENT': return state + 1; case 'DECREMENT': return state - 1; default: return state; } }; console.log(['INCREMENT', 'DECREMENT', 'INCREMENT'].reduce(reducer, 0)); // 1
их не следует называть reduce, так как reduce означает сделать меньше, эти функции чаще всего делают больше. а потом вернуть его
Comments