Fluxとは何か MVC, MVVMとの違いも含めて
動機
仕事で, React + Redux + TypeScirpt + WebPack
を使うことになりそうなので学んでいく.
そもそもjsに疎いので探り探りやっていく.
間違えもあるかもしれないが, 徐々にやっていこう.
TL;DR
- Fluxとは, アプリケーションのデータフロー管理のためのアーキテクチャパターン
- イベント駆動であり, 一方向のデータフロー制御を行う
- Fluxの特徴は,
Viewで独立したデータを持つ
,データ状態を一方向のフローで制御
,Event駆動
である. - Fluxは
Action
,Dispatcher
,Store
,View
の4要素で構成される.
Reduxとは
Reduxとは, Facebookが提唱, 開発しているJsApp.
jsにおいて, データの状態(データの流れ)を管理するためのツールである.
ReduxはFluxの実装と聞いたことがあるので, Reduxの前にFluxについて学んでいこう.
FluxもFacebookが提唱しているアーキテクチャである.
Fluxとは
FB公式から抜粋
Flux is a pattern for managing data flow in your application. The most important concept is that data flows in one direction. Fluxとは, アプリケーションのデータフロー管理のためのアーキテクチャパターンである. もっとも重要なコンセプトは`データフローが一方向にしか流れないこと`である.
JavaScriptでWebページのデータを制御する際に, データの状態制御が複雑になりやすい.
Fluxはデータの流れを一方向に限定することで状態遷移を単純にし, データ状態の複雑さを軽減させようとする考え方である.
あくまでも考え方なので, 実装は伴わない.
RESTの実装がHTTP
のように, Fluxの実装がRedux
という関係性なのかなと想像している.
Reduxの源流なので, Fluxから追っていこうと思う.
Fluxのアーキテクチャ
図をみると, 4つのパーツから構成されていることがわかる.
- Dispatcher
- Store
- Action
- View
データは必ず以下の動作で変更されていく.
- 何らかの
Action
があり(Apiからのレスポンス, ViewEvent),Dispatcher
がその全てを受ける. Dispatcher
がStore
にAction
を伝搬.Store
は,Dispatcher
から受けたAction
によってデータの状態を変更.change event
を発火する.Store
のデータ状態がView
に渡される.change event
でトリガーされる.View
がStore
から受けたデータを表示.View
で何らかのAction
が発生. 1に戻る.
store
は必ずしも1つではなく複数個持てる.
todoアプリであれば, 未消化タスク
, 消化済みタスク
でstore
を分けることが可能である.
Fluxとはなんなのか より引用
Fluxのなにがいいのか
Fluxとはなんなのかより引用するが,
Fluxを導入すると以下のメリットがあると言える
- ViewにEvent(Action)の発行元だけ持たせ, App全体をEventDrivenにした
- Storeに状態や副作用を集約したことで, そこ以外では参照等価になった.
- これにより, App全体の見通しがよくなった
個人的にまだよくわかっていないこと
MVC, MVVCとの違い
正直, MVC(Model/View/Controller)との違いがそれほど大きくわかってない. MVVC(Model/View/ViewModel/Contoller)もそうだが, Viewの中の話でほぼ終始しているような気がする.
一回整理してみよう
MVC
MVCについて振り返る. at-grandpa.hatenablog.jp より図を引用.
View
はModel
の状態を参照しているだけ.
View
はあくまでもModel
の状態を表示しているだけで, ユーザの入力はController
を伝ってModel
で処理されデータの状態が変化する.
サーバサイドレンダリングで作ったページを思い浮かべると良さそう.
View
の中でデータの状態そのものは気にせず, ユーザの明示的な操作(formのPOSTなど)としてフォームの値が渡ってくるイメージ.
(View
の中でformデータなどの状態はあるがDOMで閉じる)
MVVM
qiita.com より図を引用.
MVC
の場合は, View
がModel
を直接参照していた.
MVVM
では, View
とModel
の間にViewModel
という中間層を置く.
View
はViewModel
の状態を参照し,ViewModel
は常にView
の入力を監視する.View
に対する入力(Event
)があれば, 即座に検知してViewModel
の状態が変わる.- 逆に
ViewModel
の状態が変わればView
の表示が変更される.
これを, Two-way data Binding
と呼ぶ.
Modelの状態変更は, ユーザの明示的な操作(formのPOSTなど)によって行われる.
このとき, ViewModel
の状態がModel
に反映される.
この図には, Controller
が存在しないが Model
とViewModel
の間にControllerがある.
言い換えれば, MVVMC
となる.
Flux
Fluxの場合は, 上のような図になる. MVCと比較するためあえてMCを書いている.
Fluxは Fluxのアーキテクチャ
で述べた通り, データフローが一方向に制御されるコンセプトを持っている.
こうやって見てみると, MC
とV
で明確な境界線がある.
View側で独立のデータ
を持ち, データ状態の制御だけに関心をあてているのがFluxである.
Viewで独立のデータ構造をもつアプリケーション, と考えてしまえばMVVMとそう変わらない
MVVM
と比較すると, ViewModel
がStore
となり, データの方向制御のためにDispatcher
が登場したという形になる.
Fluxでは, Event
をAction
と呼ぶためここは同義として見て良いだろう.
MVC, MVVM, Fluxの違い まとめ
こうやってMVC
, MVVM
, Flux
を同じ構成で見てみると,
実はどれもMVC
の延長線上にあることがわかる.
というか, そもそもVIewのデータフローアーキテクチャなのでMCとは関係ないものである.
そもそも関心ごとが違うので比較するまでもなかった.
MVC
とMVVM, Flux
で大きく異なるのは, View側にサーバ(Model, Controller)とは独立したアプリケーションがあり, Viewで独立したデータ状態を持つ/制御する
ことであろう.
ここさえ理解すれば, MVVM
, Flux
はあくまでもデータフローが双方向か一方向かの違いしかないことに気づける.