@YassineElouafi2 Redux seen as a mealy machine: reducers compute next state, while Sagas compute next Effect
— Yassine Elouafi (@YassineElouafi2) 2016年2月23日
ここ数日、Reduxとはなんぞやということについてさんっざん検索して調べまわっていました。ふとミーリ・マシンっぽいなと思って"Redux Mealy Machine"でググり、Redux-sagaの中の人のこのツイートにたどり着いて、ようやくストンと腑に落ちました。参考1。参考2
ReduxでReducerの中で作用を使うなとかActionCreatorを純粋にしろとか言われてどうすりゃいいんだよウッセーなお前はおれのかーちゃんかよって思った人は多いでしょう。Reduxが何なのか理解できていないと、Reduxが要求する制限や規則は単に窮屈で複雑、難解なだけです。でもReduxが何を表現しているのかがわかったら、あのような厄介な規則もとたんに前向きに受け入れられるようになりました。
Reduxとは何か。Reduxはミーリ・マシンだ。アプリケーションから状態遷移の部分のみを切り離して抽象化した、有限状態機械だ。Actionとは入力記号$\rm Σ$であり、Reducerとは状態遷移関数$\rm S × Σ → S$だ。Reduxは状態遷移のみを取り扱う純粋な機械であり、現実世界との相互作用とは独立してその状態遷移をテストできる。
Reduxだけでは計算は進んでいかない。Redux-Sagaはselect
とtake
で$\rm S$と$\rm Σ$を取り出し、$\rm S × Σ$から現実世界との相互作用$\rm Λ$を計算する出力関数$\rm S × Σ → Λ$として振る舞う。それからSagaは作用$\rm Λ$を現実世界に作用させ、その結果に応じて$\rm Σ$をput
で再びReduxの中に投げ入れることで、ミーリ・マシンたるReduxを駆動する役目を持つ。
まとめ
React/Reduxは難しいのでElmを使おう!