Model-View-Controller

アプリケーション本体とユーザインタフェースの分離


UIMS (User Interface Management Systems)

UIMS (User Interface Management Systems) は、アプリケーションプログラム におけるGUI部を効率よく構築するための 実行ライブラリとその構築を支援するツールである。

UI(対話)独立性

一方の変更が他方に影響を及ぼさないようにする

MVC とは

Smalltalk には、MVC(Model-View-Controller)フレームワーク と呼ばれるウィンドウプログラムを作成する指針が存在する。 MVC の主な利点は、

MVCの3要素


GUIアプリケーションの構成


矢印はメッセージの流れを示している。 ビューはコントローラとモデルを知っている。 コントローラはビューとモデルを知っている。 モデルはビューもコントローラも知らない。 MVCモデルの目的はアプリケーション本体とユーザインタフェースの明確な分離 にある。

changed-update メカニズム

一つのモデルに対して複数のビュー・コントローラを利用するために changed-update (dependency) を利用する 違いを比較するために、コントローラが頑張るMVCから見ていく。

コントローラが頑張るMVC


ユーザはコントローラに指示を出す。
  1. コントローラはモデルに変更メッセージを送る
  2. コントローラはビューに変更メッセージを送る
  3. ビューがモデルに状態を尋ねて再描画する
コントローラが制御の主体となる。

コントローラが頑張るMVCの問題点

一つのモデルに複数のビュー・コントローラが存在する場合を考える。
ユーザはコントローラ1に指示を出す。
  1. コントローラ1はモデルに変更メッセージを送る
  2. コントローラ1はビュー1に変更メッセージを送る
  3. ビュー1がモデルに状態を尋ねて再描画する

問題点

ビュー2は以前として古い情報を表示したままである。

正しくない解決方法

ユーザはコントローラ1に指示を出す。
  1. コントローラ1はモデルに変更メッセージを送る
  2. コントローラ1はビュー1に変更メッセージを送る
  3. ビュー1がモデルに状態を尋ねて再描画する
  4. コントローラ1はビュー2に変更メッセージを送る
  5. ビュー2がモデルに状態を尋ねて再描画する

なぜ正しくないか

ビュー・コントローラが増えれば破綻する。

依存を利用したMVC


モデル自身に変化があった場合には、モデルが自分自身にchanged: メッセージを送る。 すると、 dependency を通して自動的にモデルと依存関係にあるビューが再描画 (update:) される。
ユーザはコントローラ1に指示を出す。
  1. コントローラ1はモデルに変更メッセージを送る
  2. モデルは自分自身に changed: メッセージを送る
  3. dependency を通してすべてのビューに update: メッセージが送られる
  4. 各ビューがモデルに状態を尋ねて再描画する
なぜモデル自身に changed: を送るとビューが update: されるのか?
魔法があるわけではない。 Smalltalk-80 には、モデルとビューの依存関係を管理する辞書である DependentsFields がある。 最近の Smalltalk には Model クラスに dependents を保持するインスタンス変数があり、依存関係の高速化を行なっている。 いずれにしても、モデルは、dependents から自分のビューおよびコントローラを知ることができる。

dependency の表記


Observer Pattern である。

ビューの構成

ウィンドウは複合オブジェクトとして構成

インスタンスツリー


プラガブルMVC

モデルとビュー・コントローラ間の対話を標準化し、様々なモデルに手軽に 利用できるようなインタフェースを実現する目的として、プラガブル (Pluggable) MVCの概念がある。 モデルに依存しない、標準化されたビュー・コントローラをプラグインすることに よって、定型的な MVC が簡単に構成できる。 また、一つのモデルをいくつかのサブビューに表示するために、各サブビューに機能を表わす名前 (aspect)を付け、モデルの変化に従ってどのビューを書き換えるか を指示して、不必要な再描画の遅延を避けている。 一つのモデルを複数の視点(テキスト、ビットマップ、リスト等)から表示することを目的とする。

参考文献

他の文献
Copyright (C) 1999 Hidetaka Masuda