by @sharkattack51

June 2, 2016

Redux.NET

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原則

  1. Single source of truth

    アプリケーション内でStoreは1つのみとし、State は単独のオブジェクトとしてStoreに保持される。

  2. State is read-only

    State を直接変更することはできず、action を Store へ dispatch することでしか State は変更できない。

  3. Mutations are written as pure functions

    State を変更する関数 Reducer は pure な関数にする。