Model View ViewModel
MVVMはModel-View-Controller(MVC)から派生したアーキテクチャであり、いくつかの違いがある。
まずMVVMのViewはMVCにおけるControllerを包含している。これは現代のGUIプラットフォームがControllerがかつて担っていた仕事の殆どを抽象化しており、thin Controllerをわざわざ区別する必要性が低いからである。当初(MVCが提唱されたのは1979年)のMVCはマウスカーソルがどのView要素上に位置するかController側でハンドリングしていたが、現代のWebブラウザはそれを全て自動で行っている。
またMVVMのViewは宣言的に定義され状態を持たない。MVCにおけるViewは状態を持つViewクラスであり、Modelには含まれないView用の状態(View State。例: UI遷移中を示す属性)を保持していた。MVVMにおいてこの責務はViewModelへと移され、ViewはUIの定義と値のマッピングのみに責務を持っている。
すなわちMVVMは、MVCをModel-Viewと解釈した上でViewを宣言型とし、Modelへの参照とView状態をもつ仲介役としてViewModelを導入している。
model-viewでの開発プロセス差異(課題1)を許容しかつview状態を表現する(課題2)ために、MVVMパターンではソフトウェアをModel (モデル)、View (ビュー)、ViewModel (ビューモデル) に三分割する。
MVVMではmodelとviewを明示的に分離する(関心の分離#プレゼンテーションとドメインの分離)。これによりmodelとviewを異なるツールで異なる人が開発でき、効率よい協業が可能になる。
またMVVMでは「Viewのためのモデル(model for a view)」としてViewModelを導入する。ViewModelはViewとModelの中間に存在し、表示のためにmodel値をデータバインディング可能な形式へ変換して状態として保持する。また操作のために演算用コマンド(ハンドラ)を有している。このViewModelによる状態表現により、modelをviewに関知せず構築し、viewはデータバインディングを介したUI表示のみに特化させながら、model-view間をシームレスに繋ぐことが可能になる。
Model-View-ViewModel (MVVM、モデル・ビュー・ビューモデル) はUIを持つソフトウェアに適用されるソフトウェアアーキテクチャの一種である。
MVVMはソフトウェアをModel・View・ViewModelの3要素に分割する。プレゼンテーションとドメインを分離し(V-VM / M)また宣言的Viewを分離し状態とマッピングを別にもつ(V / VM)ことでソフトウェアの保守性・開発生産性を向上させる。
Model-View-ViewModelパターンはModel-View-Controller (MVC) パターンの派生であり、特にPresentation Model パターンを直接の祖先に持つ。元来マイクロソフトのユーザインタフェースサブシステムであるWindows Presentation Foundation (WPF) やSilverlightの世界で生まれた考え方ではあるが、現在はAndroidやウェブブラウザ上でのJavaScriptの世界でもMVVMの利用は広がっている。