Model View Controller
1979年: パロアルト研究所にてトリグヴェ・リーンスカウクが考案。長い間、Smalltalk-80の実装のみが公開され、MVCに関する公開情報はなかった
1988年: 最初の論文「A Cookbook for Using the Model-View-Controller User Interface Paradigm in Smalltalk -80」が公開
1994年: 書籍「Design Patterns:Elements of Reusable Object-Oriented Software」内で取り上げられる
1999年: MVCのサーバサイド実装としてJavaServer Pages Model 2が発表
元来Smalltalkにおけるウィンドウプログラム開発のための設計指針として生まれたが、構造が複雑となりがちなグラフィカルユーザインターフェース (GUI) をもつソフトウェアにおける有用性から他方面へ広がった。
その後、Smalltalk-80から派生したSqueakでは、Selfから移植されたGUIツールキットMorphicが主に使われるようになった。Morphicではビューとコントローラを分離しておらず、その後の多くのGUIツールキットでもビューとコントローラは完全には分離されていない。これはビューとコントローラはお互いに強く依存しており、分離する利点よりも欠点の方が上回ったためである。
MVCの実装はさまざまであるが、制御フローは一般的に次のようになる。
コントローラが入力機器(マウスやキーボードなど。Smalltalk-80ではInputSensorで表わされる)を監視する。
ユーザが入力機器に入力を与える。
コントローラがユーザのアクションに応じてモデルのメソッドを呼ぶ。その結果モデルのデータが書き換えられる場合もある。
モデルが変更された場合、自身が変更された旨をビューなどのオブザーバに対して通知する。
ビューはモデルから関連するデータを取得し、出力を更新する。典型的には画面に図形を描画する。
このシナリオでビューやコントローラをそれぞれ1つのオブジェクトとして単純化して説明しているが、実際にはビューは階層構造になっていて、各ビューごとに対応するコントローラが存在する。そのためユーザからの入力を処理すべきコントローラを決定する作業が必要となる。例えばSmalltalk-80ではマウスカーソルを含むビューに対応するコントローラが入力を処理するのが原則であり、次のようなステップで入力を処理すべきコントローラを決定する。
コントローラはビューに対し、入力を処理すべきコントローラを問い合わせる(ビューの位置や階層構造を知っているのはビューなので)。
ビューはコントローラに現在のマウスカーソルの位置を問い合わせる(入力機器の状態を知っているのはコントローラなので)。
ビューはマウスカーソルを含むビューを探す。
そのビューに対応するコントローラを、入力を処理すべきコントローラとする。
ユーザからの入力(通常イベントとして通知される)をモデルへのメッセージへと変換してモデルに伝える要素である。すなわち、UIからの入力を担当する。モデルに変更を引き起こす場合もあるが、直接に描画を行ったり、モデルの内部データを直接操作したりはしない。
なお、UIにおける入力と出力は本質的には不可分なものであり、したがってビューとコントローラはいつでも分離できるとは限らない。このようなM-VCとなるような構造をDocument-Viewと呼ぶ。