Model View Controller

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動先: 案内検索
ファイル:MVC-Process.svg
MVCの典型的な相関図

MVCModel View Controller モデル・ビュー・コントローラ)は、ユーザーインタフェースをもつアプリケーションソフトウェアを実装するためのデザインパターンである。

アプリケーションソフトウェアの内部データを、ユーザーが直接参照・編集する情報から分離する。そのためにアプリケーションソフトウェアを以下の3つの部分に分割する。

  1. model: アプリケーションデータ、ビジネスルール、ロジック、関数
  2. view: グラフや図などの任意の情報表現
  3. controller: 入力を受け取りmodelとviewへの命令に変換する

MVCの歴史

  • 1979年: パロアルト研究所にてTrygve Reenskaugが考案。[1][2]長い間、Smalltalk-80の実装のみが公開され、MVCに関する公開情報はなかった
  • 1988年: 最初の論文「A Cookbook for Using the Model-View-Controller User Interface Paradigm in Smalltalk -80」[3]が公開[4]
  • 1994年: 書籍「Design Patterns:Elements of Reusable Object-Oriented Software」[5]内で取り上げられる
  • 1999年: MVCのサーバサイド実装としてJavaServer Pages Model 2が発表[6]

元来Smalltalkにおけるウィンドウプログラム開発のための設計指針として生まれたが、構造が複雑となりがちなグラフィカルユーザインターフェース (GUI) をもつソフトウェアにおける有用性から他方面へ広がった。

MVCの構造

ファイル:ModelViewControllerDiagram2.svg
Model-View-Controller 概念的な構成図。</br> 直線は直接的なAssociationを表し、破線は (例えば)Observer パターンを経た間接的なAssociationを表す。

MVCでは、プログラムを3つの要素、Model(モデル)、View(ビュー)、Controller(コントローラ)に分割する。

Model
そのアプリケーションが扱う領域のデータと手続き(ビジネスロジック - ショッピングの合計額や送料を計算するなど)を表現する要素である。また、データの変更をviewに通知するのもmodelの責任である(modelの変更を通知するのにObserver パターンが用いられることもある)。
多くのアプリケーションではデータの格納に永続的な記憶の仕組み(データベースなど)が使われている。MVCの概念では、データの(UI以外の)入出力は取り扱わないので、データアクセスも本来MVCの概念の範疇を超えるものではあるが、あえて言えばmodelの中に隠蔽されると考えられる。
View
modelのデータを取り出してユーザが見るのに適した形で表示する要素である。すなわち、UIへの出力を担当する。例えば、ウェブアプリケーションではHTML文書を生成して動的にデータを表示するためのコードなどにあたる。
Controller
ユーザの入力(通常イベントとして通知される)に対して応答し、それを処理する要素である。すなわち、UIからの入力を担当する。modelとviewに変更を引き起こす場合もあるが、直接に描画を行ったり、modelの内部データを直接操作したりはしない。

なお、UIにおける入力と出力は本質的には不可分なものであり、したがってviewとcontrollerはいつでも分離できるとは限らない。このようなM-VCとなるような構造をDocument-Viewと呼ぶ[7]

対象となるモデルにビュー・コントローラを持たせるだけでなく、ユーザとモデルの構成要素との対話のために各々の構成要素にもビュー・コントローラを持たせる構造を拡張MVCと呼ぶ[8]

MVCのシナリオ

MVCの実装はさまざまであるが、制御フローは一般的に次のようになる。

  1. ユーザがユーザインタフェースを通してviewに入力する(ボタンを押すなど)。
  2. controllerがviewからの入力イベントを処理する。controllerは登録されているイベントハンドラコールバックを通して呼ばれることが多い。
  3. controllerがユーザのアクションに応じてmodelのメソッドを呼ぶ。その結果modelのデータが書き換えられることもある[9]
  4. viewがmodelから関連するデータを取得し、出力を更新する。
  5. viewがユーザの次の操作を待つ。始めに戻って、新しいサイクルに入る。

MVCとデザインパターン

MVCは、デザインパターンの1種と扱われる場合もあるが(MVCパターンと呼称される)、MVC自体が他の小さなデザインパターン(Observer パターンCommand パターンFactory Method パターンFacade パターンなど)を利用して実装されることが多いところからすると、デザインパターンというより、さらに粒度の大きい1種のソフトウェアアーキテクチャという方が適当であろう[7][10]

各モジュールが比較的はっきりと分かれ、プログラムの見通しがよくなるとともに、ユーザインタフェース (UI) 部分を別のモジュールに取り替えることが容易となるのが利点である。自動プログラミングなどにも適している。

脚注

テンプレート:脚注ヘルプ

  1. MVC XEROX PARC 1978-79
  2. The Model-View-Controller (MVC) Its Past and Present
  3. A Cookbook for Using the Model-View-Controller User Interface Paradigm in Smalltalk -80
  4. Model View Controller History
  5. テンプレート:Cite book
  6. Understanding JavaServer Pages Model 2 architecture
  7. 7.0 7.1 テンプレート:Cite book
  8. テンプレート:Cite journal
  9. 複雑なcontrollerはアクションの実体を隠蔽し、拡張を容易にするため、Command パターンを使って構造化されることが多い
  10. Model View Controller As An Aggregate Design Pattern

関連項目

テンプレート:デザインパターン (ソフトウェア)