2015-12-19 42 views
47

parte dalla documentazione ufficiale:Redux: perché le funzioni di stato sono chiamate riduttori?

Si chiama un riduttore perché è il tipo di funzione che si passerebbe a Array.prototype.reduce (? Riduttore, initialValue)

E doesn' Ho molto senso per me. Qualcuno potrebbe spiegarmi perché in realtà sono chiamati riduttori? Il fatto che restituiscano un valore predefinito (o che abbiano un valore di argomento predefinito) non li rende riduttori IMHO.

+3

Sono riduttori esattamente perché si comportano come la funzione passata a 'reduce', che ha accesso al valore predefinito e ad un altro valore, e restituisce il valore predefinito potenzialmente trasformato.'state -> action -> state' – azium

+1

una rosa con qualsiasi altro nome ... probabilmente marketing; map/reduce è una parola d'ordine ora ... – dandavis

risposta

39

Il fatto che restituiscano un valore predefinito (o che abbiano un valore di argomento predefinito ) non li rende riduttori IMHO.

Riduttori Non valori di default solo ritorno. Restituiscono sempre l'accumulo dello stato (basato su tutte le azioni precedenti e attuali).

Pertanto, si comportano come un riduttore di stato. Ogni volta che viene chiamato un riduttore di ridondanza, lo stato viene passato con l'azione (state, action). Questo stato è quindi ridotto (o accumulato) in base all'azione, quindi viene restituito lo stato successivo. Questo è un ciclo della classica funzione fold o reduce.

Come @azium sommato con state -> action -> state.

+0

Grazie, ora che per me ha senso, sono appena stato perso per un po 'di tempo –

+3

Humm da questa logica non dovrebbero essere chiamati moltiplicatori piuttosto che riduttori? Nessun dato viene mai ridotto all'aggiunta:/lol –

+6

@JamieHutber Credo che in questo contesto manchi leggermente il significato del riduttore. riduttore sta prendendo un flusso (o una raccolta) di oggetti e li combina in un singolo oggetto. In questo caso, tutte le azioni (nel tempo) sono la raccolta di elementi e lo stato è il singolo elemento. Ha senso? –

17

Se consideri la serie di azioni nella tua app come una lista, o forse più come un flusso, potrebbe avere più senso.

prendere questo esempio forzato:

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

Il primo argomento è una funzione della forma (Int, String) => Int. Insieme a un valore iniziale, si passa a reduce ciò che potrebbe essere chiamato una "funzione di riduzione" e si ottiene il risultato dell'elaborazione della serie di elementi. Quindi si potrebbe dire che la funzione di riduzione descrive cosa viene fatto con ogni singolo elemento successivo per modificare il risultato. In altre parole, la funzione reducer prende l'output precedente e il valore successivo e calcola l'output successivo.

Questo è analogo a quello che fa un riduttore di Redux: prende lo stato precedente e l'azione corrente e calcola lo stato successivo.

In vero stile di programmazione funzionale, è possibile cancellare concettualmente il significato applicato agli argomenti e al risultato e concentrarsi solo sulla "forma" degli input e dell'output.

In pratica, i riduttori di Redux sono tipicamente ortogonali, nel senso che per una determinata azione, non tutti apportano modifiche alle stesse proprietà, il che rende facile dividere le loro responsabilità e aggregare l'output con combineReducers.

+0

Sì, hai ragione, ha più senso quando sto pensando ad azioni più simili a un flusso. Cool, apretiate questo! –

+0

Questo è stato il modo in cui l'ho capito inizialmente, ma questo non sembra essere il modo in cui alcune delle implementazioni del negozio che ho visto finora lo hanno implementato ... –

2

Lo stato di pensiero dell'autore è l'accumulatore della funzione di riduzione. Es:

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

La funzione di riduzione proviene da Programmazione funzionale, il nome "riduttore" proviene anche da FP.

Non mi piace usare quel nome qui. Perché non vedo il mondo come un valore unico risultato dopo azioni. Lo stato qui è un oggetto. Per esempio:

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

Questo Reducer riduce nulla. E non mi interessa ridurre niente o no. Chiamarlo come Il trasduttore avrà più senso.

3

Sappiamo da dove provengono i riduttori (programmazione funzionale) e perché potrebbero essere considerati come ridurre il lavoro (ridurre n elementi di input a un valore di ritorno singolo, che è proprio ciò che le normali funzioni sono supposte). Tuttavia: il nome è solo un nome, come la rosa è il nome di una rosa. Non pensare troppo. I programmatori di Redux sono persone IT, sono bloccati nel loro contesto e lì ha senso. Il resto di noi deve accettare il diritto dell'inventore di chiamare un gatto blu un gatto giallo ;-)

5

Come già accennato, il nome è legato al concetto di un riduttore nella programmazione funzionale. È inoltre possibile trovare la definizione del dizionario Merriam-Webster di reducer utile:

1a. per riunire o far convergere: consolidare (ridurre tutte le domande ad una)

Il riduttore consolida le azioni in un singolo oggetto che rappresenta lo stato dell'applicazione.

+0

Ho cancellato il mio commento a favore di questa spiegazione, specialmente l'ultima riga – PrimeLens

2

Il motivo per cui è chiamato un reducer è perché si potrebbe "ridurre" un collection of actions ed un initial state (del serbatoio) su cui eseguire queste azioni per ottenere la risultante final state.

Come? Per rispondere a questa, mi permetta di definire nuovamente un riduttore:

Il ridurre() metodo si applica un function contro un accumulator e ciascun valore della matrice (da sinistra a destra) per ridurlo ad un unico valore.

E cosa fa un riduttore di riduzione?

Il riduttore è un puro function che prende lo stato attuale e un azione e restituisce lo stato successivo. Si noti che lo stato è accumulated poiché ogni azione sulla raccolta viene applicata per modificare questo stato.

Quindi, dato un collection of actions, il riduttore viene applicata su ogni valore della raccolta (da sinistra a destra). La prima volta, restituisce lo initial value. Ora il riduttore viene applicato nuovamente su questo stato iniziale e la prima azione per restituire lo stato successivo. E il successivo elemento di raccolta (azione) viene applicato ogni volta sullo current state per ottenere lo next state fino a raggiungere la fine dell'array. E poi, ottieni the final state. Quant'è fico!

Problemi correlati