yotiky Tech Blog

とあるエンジニアの備忘録

Reduxの概要

Unityのアプリケーションのアーキテクチャを考えるのに、参考になるかと思ってJavaScript界隈の最近の流行を調べて見たので覚書。
JavaScriptiOS界隈もそんなに詳しくないので、入門記事やそのサンプルなど眺めながら理解した内容です。

目次

TL;DR

ReduxはJavaScriptアプリのための、状態を管理するためのフレームワーク
View、表示に関する責務はそれに特化したフレームワークに委ね、組み合わせて利用する事が多い。代表的なのはReact。

Redux + α

iOS ReSwiftを元にReduxを読み解く

一番解りやすかったのがiOS向けにReduxを説明した記事だったのでこのような形に。1 斜体はReSwift特有の事項。

  • State
    • Data, POCO
    • Root(e.g. AppState)を起点としたツリー構造
    • Reducerに渡すものはStateTypeを継承してマーキング
  • Action
    • 処理種別と入力パラメータを持つData, POCO
    • 処理手続きのための申請書みたいなイメージ
    • Actionを継承してマーキング
    • 「具体的にどう変化させるか」という結果ではなく、UseCase(何を指示するか)で定義する
  • Reducer
    • Actionを受理しStateを更新する
    • StateとReducerは対になる(つまりツリー、reducer composition)
    • ActionはすべてのReducerにBroadcastされる(伝搬)
    • 各Reducerは自身で判断し、対のStateを変更する
    • (state, action) => state を満たす副作用のない純粋関数
      • 引数の値を変更しない
      • API呼んだり、ページ遷移などダメ
      • 毎回結果の変わるものを使わない(現在日時とか乱数とか)
    • Root(e.g. appReduce)を起点に下位のReducerにブロードキャスト
  • Store
    • シングルトン
    • データを保持する(「State+Reducer」のツリー)
    • Dispatchメソッドを提供する
    • 状態の変更通知するため、リスナー(View)を登録するメソッドを提供する
      • Dispatchの結果、登録されたリスナーに通知される
      • この時Storeから現在のStateを取得することもできる
  • Dispatch
    • Actionを引数にStoreに手続きを依頼する窓口
  • ActionCreator
    • Actionを構築し生成するだけ

Reduxの処理の関連図。 f:id:yotiky:20181018225458p:plain

個人的なイメージはこんな感じ。
f:id:yotiky:20181018225444p:plain

React

  • Viewを表示することに特化したライブラリ
  • 仮想DOM(Virtual DOM)
    • 生のDOM(HTMLのインスタンス)ではなく、対となるツリーな構造体
    • StateAとStateBのHTML的なdiffを取り差分を埋めるpatchを生成し、patchを適用することで状態を遷移させる(表示を変化させる)
    • 生のDOMを操作する文化から脱却

Redux(JS) 上級

  • Middleware
    • ActionやReducerで必要になりそうな副作用のある処理や非同期処理はここに押し込める

イメージはこんな感じになるのかな。
f:id:yotiky:20181018225432p:plain

まとめ

サーバーサイドはViewとそれ以外のModelって発想でModelを小さく表現してその実巨大なわけだけど、フロントサイドもMiddlewareと言うロジックを書く領域小さく表現してるが結構身が詰まってそうだなぁと。

HTMLはRootがあってそこからTreeがあるってのが大前提にあり、ReduxもReactもそれを踏まえた上での仕組みですね。
UIデザインの構成もコンポーネント志向により親子構造を構築する流れもありそうだし、全体通して方向性が一致してていいのではと思う。

一方UnityはHierarchyがツリー構造ではあるものの、全然枝葉の違う所同士で割と縦横無尽に関係を築きたがるし、相互に関連するものも多いので、Tree縛りでUI、状態を構成するとなると相当に大変かなと思う。Unityそのものを喰らうぐらいの思想とパワーがないと厳しかろうて。
部分的に親子構造を持ちつつ親が子を操作するのではなく、伝播させるって仕組みくらいは参考になりそうなならなそうな、使い所は考えたい。

参考