https://github.com/GuillaumeSalles/redux.NET
- State 管理のライブラリ。内部で Rx を用いることで、ライブラリ自体はごく薄いものとなっている。他と組み合わせやすそう。
- オリジナルは JS 版
- Rx がもつ「関係性をプログラムする」という流れを踏襲することで、機能分割を明確にできる
- ロジックを一カ所にまとめることができる
- データフローが一方向になる
参考
登場人物
- Action : 何をするかの内容をもつオブジェクト
- State : アプリケーションの状態をもつオブジェクト
- Store : 現在の State を持つ。Action を受け取って State と一緒に Reducer に渡す
- Reducer : 受け取った Action と State から新しい State を返す。Pure 関数。
流れ
- ViewProvider は View の各コンポーネントを管理し、関連付けを行う。
- ViewProvider は状態を持たない
- Store が個別の状態 State を持っており、ViewProvider が Store を持っている
- 各コンポーネントは Store に Action を Dispatch することで処理を実行する。各コンポーネント自体が処理を実行はしない。
- State オブジェクトは現在のアプリケーションの状態をもつ。ツリー構造を用いて全体的な状態をもつこともできる。
- 実際の処理は Store が現在の State と一緒に、送られた Action を Reducer に渡す
- Reducer は State と Action をもとに新しい State を返す。(元の State オブジェクトを更新しない。Pure関数)
- Reducer は Pure 関数であり、入力Aの場合は毎回Bを返さなければならない
- Reducer はだんだん肥大化するので、分割を検討する。Stateのツリー構造に対応して子Reducerに分割し、親Reducerがまとめるようにする。
Pure関数
必ず結果が一緒になる関数
- 引数の値を変更するのはだめ
- 副作用をおこす(APIを呼んだり、ルーティングを変えるなど)はだめ
- 毎回値が変わるもの(Date.now() や Math.random())を扱うのはだめ
3原則
Single source of truth
アプリケーション内でStoreは1つのみとし、State は単独のオブジェクトとしてStoreに保持される。
State is read-only
State を直接変更することはできず、action を Store へ dispatch することでしか State は変更できない。
Mutations are written as pure functions
State を変更する関数 Reducer は pure な関数にする。