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



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




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




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

605   9  

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 Это потому, что вы могли бы "уменьшить" a collection 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

    Ничего не найдено.