MVVMはソフトウェアを分割管理する方法です。
MVVMの目的は2つあります。
・UI分離(プレゼンテーションとドメインの分離)
UIに関係ある部分
UIに関係ない部分
を分離する
・表示と表示データロジックの分離(Viewと状態の分離)
UI表示は表示だけを担当
表示するデータとロジックはUIデータロジック
として分離する。
考え方1
ソフトウェアを
UI と UI以外 に分離する。
UI を UI表示 と UIデータロジック に分離する。
UI表示を View
UIデータロジックを ViewModel
UI以外を Model
と呼びます。
上記の方針で分離したので、
Viewにはデータロジックはない。
ViewModelにUIのためのデータロジックはある。
ModelにはUIの関心事は存在しない。
考え方2
ソフトウェアをUI表示とビジネスロジックに分ける。
ビジネスロジックをUIロジックとドメインロジックにわける。
ソフトウェア = UI表示 + UIロジック + ドメインロジック
UI表示:View
UIロジック:ViewModel
ドメインロジック: Model
Viewにはデータとロジックはない。
ViewModelに表示データとUIロジックはある。
ModelにはUIロジックはない。
依存方向
ViewはViewModelとやり取りを行い。
ViewModelはModelとやり取りを行い。
ViewとModelは直接やり取りを行わない。
View -> ViewModel -> Model
の方向に依存する。逆の依存はない。
ViewはViewModelにアクセス可能
ViewModelからViewはアクセスできない。
ViewModelはModelにアクセス可能
ModelからViewModelにはアクセスできない。
データバインディングについて
Viewの表示データをViewModelに保持して
Viewはデータバインディングを使用して表示を行う。
データバインディングはMVVM外のフレームワークが実行している。
(WPFの場合はWPFフレームワーク)
データバインディングはMVVMの本質ではない。実装の一手段にすぎない。
データバインディングの代わりにRxを使用する実装もある。