Подтвердить что ты не робот

Почему функции состояния Redux называются редукторами?

Это часть официальной документации Redux:

Его называют редуктором, потому что это тип функции, который вы передадите в Array.prototype.reduce(reducer,?initialValue)

Это не имеет особого смысла для меня. Может ли кто-нибудь объяснить мне, почему их на самом деле называют редукторами? Тот факт, что они возвращают значение по умолчанию (или имеют значение аргумента по умолчанию), не делает их редукторами ИМХО.

4b9b3361

Ответ 1

Тот факт, что они возвращают значение по умолчанию (или они имеют значение по умолчанию значение аргумента) не делает их редукторами IMHO.

Редукторы не просто возвращают значения по умолчанию. Они всегда возвращают накопление состояния (на основе всех предыдущих и текущих действий).

Поэтому они действуют как редуктор состояния. Каждый раз, когда вызывается редукционный редуктор, состояние передается с действием (state, action). Это состояние затем уменьшается (или накапливается) на основе действия, а затем возвращается следующее состояние. Это один цикл классической функции fold или reduce.

Как @azium суммируется с state -> action -> state.

Ответ 2

Если вы считаете, что последовательность действий в вашем приложении будет похожа на список или, может быть, больше похожа на поток, это может иметь больше смысла.

Возьмите этот надуманный пример:

['apple', 'banana', 'cherry'].reduce((acc, item) => acc + item.length, 0)

Первый аргумент - это функция вида (Int, String) => Int. Наряду с начальным значением вы передаете reduce то, что можно назвать "функцией редуктора", и вы получаете результат обработки ряда элементов. Таким образом, вы можете сказать, что функция редуктора описывает, что делается с каждым последующим отдельным элементом, чтобы изменить результат. Другими словами, функция редуктора принимает предыдущий вывод и следующее значение, и он вычисляет следующий результат.

Это аналогично тому, что делает редуктор Redux: он принимает предыдущее состояние и текущее действие и вычисляет следующее состояние.

В истинном стиле функционального программирования вы можете концептуально стереть значение, применяемое к аргументам и результату, и просто сосредоточиться на "форме" входов и выходов.

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

Ответ 3

Как уже упоминалось, имя связано с концепцией редуктора в функциональном программировании. Вы также можете найти полезное определение словаря Merriam-Webster для редуктора:

1а. объединить или привести к сближению: консолидировать (свести все вопросы к одному)

Редуктор объединяет действия в один объект, представляющий состояние приложения.

Ответ 4

Причина, по которой редукторный редуктор называется reducer заключается в том, что вы могли "уменьшить" collection of actions и initial state (хранилища), в котором нужно выполнить эти действия, чтобы получить итоговое final state.

Как? Чтобы ответить на этот вопрос, позвольте мне снова определить редуктор:

Метод redu() применяет function (reducer) к accumulator и каждому значению массива (слева направо), чтобы уменьшить его до одного значения.

А что делает редуктор?

Редуктор - это чистая function которая принимает текущее состояние и действие и возвращает следующее состояние. Обратите внимание, что состояние accumulated поскольку каждое действие в коллекции применяется для изменения этого состояния.

Таким образом, с учетом collection of actions редуктор применяется к каждому значению набора (слева направо). Первый раз возвращает initial value. Теперь редуктор снова применяется к этому начальному состоянию и первое действие для возврата следующего состояния. И следующий элемент коллекции (действие) применяется каждый раз к current state чтобы получить next state пока оно не достигнет конца массива. И тогда вы получите the final state. Как это круто!

Ответ 5

Автором считается состояние аккумулятора функции уменьшения. Пример:

Final State = [Action1, Action2, ..., ActionN].reduce(reducer, Initial State);

Функция уменьшения исходит из функционального программирования, название "редуктор" также поступает из FP.

Мне не нравится использовать это имя здесь. Потому что я не вижу мир как результат единственного значения после действий. Состояние здесь - объект. Например:

['eat', 'sleep'] === [addTodo('eat'), addTodo('sleep')].reduce(reducer, []);

Этот Редуктор ничего не уменьшает. И мне все равно, что он что-то уменьшает или нет. Именование его как Преобразователь будет иметь больше смысла.

Ответ 6

Мы знаем, откуда приходят редукторы (функциональное программирование), и почему их можно считать уменьшающими работу (уменьшите количество входных элементов до одного возвращаемого значения, что и есть нормальные функции supposted do). Однако: Имя - это просто имя, например, роза - это название розы. Не думай слишком много. Прогеммеры Redux - это ИТ-специалисты, они заперты в их контексте, и там это имеет смысл. Остальные должны принять право изобретателя называть голубую собаку желтой кошкой;-)

Ответ 7

Я не мог понять, как редуктор Redux напрямую сопоставлен с функцией, которую вы используете с помощью reduce, поэтому вот пара примеров, чтобы увидеть, как они совпадают.

Сначала стандартная функция редуктора (называемая "аккумулятор" в MDN) из документации MDN Array.reduce, а затем упрощенный пример Dan Abramov Counter.js в конце его поста "Возможно, вам не понадобится Redux".

  • sum добавляет значение к аккумулятору
  • reducer добавляет/вычитает значение в/из аккумулятора.

В обоих случаях здесь "состояние" - это просто целое число.

Вы "накапливаете" действия в государстве. Это также неизменный способ изменить любой объект JavaScript.

const sum = function(acc, val) {
    return acc + val;
};

const reducer = function(state, action) {
    switch (action) {
        case 'INCREMENT':
            return state + 1;
        case 'DECREMENT':
            return state - 1;
        default:
            return state;
    }
};

console.log('sum', [1, -1, 1].reduce(sum, 0));

console.log('reduce', ['INCREMENT', 'DECREMENT', 'INCREMENT'].reduce(reducer, 0));

console.log('sum', [1, 1, 1].reduce(sum, 0));

console.log('reduce', ['INCREMENT', 'INCREMENT', 'INCREMENT'].reduce(reducer, 0));

Ответ 8

Их не следует называть "уменьшить", поскольку "уменьшить" означает "делать меньше", эти функции чаще всего дают больше. а затем верните его

Ответ 9

Другие ответы хорошо объясняют, почему он назван так, как есть, но давайте попробуем назвать больше вещей...

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. Но что на самом деле вы вводите в оператора? OriginState И имена действий. Так что даже в Smalltalk имена методов не очень понятны.

actionOperators[increment] - это Reducer, но я бы скорее назвал его и actionOperator, потому что он реализован для каждого действия. Состояние - это просто аргумент (и еще один в качестве возвращаемого значения).

Редуктор, однако, является лучшим словом, чтобы быть в верхней части результатов поиска Google. Это также похоже на Redux.

Ответ 10

Как насчет того, чтобы отныне называть его Дедуцером? Он выводит новое состояние на основе предыдущего состояния и поступающего действия.

Ответ 11

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

const array1 = [1, 2, 3, 4];
const reducer = (accumulator, currentValue) => accumulator + currentValue;

// Think of it as a stack like is: 

// | 2 | | 3 | | 4 | 
// |_1_| |_3_| |_6_| | 10 | => the 10 is in result

console.log(array1.reduce(reducer));
// expected output: 10

Метод redu() выполняет функцию редуктора (которую вы предоставляете) для каждого элемента массива, в результате чего получается одно выходное значение.