Model-View-Controller
アプリケーション本体とユーザインタフェースの分離
UIMS (User Interface Management Systems)
UIMS (User Interface Management Systems) は、アプリケーションプログラム
におけるGUI部を効率よく構築するための
実行ライブラリとその構築を支援するツールである。
UI(対話)独立性
一方の変更が他方に影響を及ぼさないようにする
- 内部設計とUI設計を分離できる
- 複数のUI戦略が利用可能になる
- UI構築者の役割が確立される
MVC とは
Smalltalk には、MVC(Model-View-Controller)フレームワーク
と呼ばれるウィンドウプログラムを作成する指針が存在する。
- Model-View-Controller の略
- 3種類のオブジェクトがメッセージ交換をしながら協調作業を行ない、アプリケーションとして動作する
MVC の主な利点は、
- アプリケーション本体は、自分のインタフェースであるウィンドウの状
態を気にすることなく記述できる。
- アプリケーション本体は、モデルとして各々が開発して、それに対する
インタフェースは、既存のビューとコントローラを再利用してカスタマイズで
きる。
MVCの3要素
- モデル
問題対象としてのデータとそのデータに対する操作
- ビュー
ディスプレイを通して、モデルからユーザへ情報を提供するもの
- コントローラ
ユーザからの入力を解釈して、モデルあるいはビューに適切な調整を施すもの
GUIアプリケーションの構成
矢印はメッセージの流れを示している。
ビューはコントローラとモデルを知っている。
コントローラはビューとモデルを知っている。
モデルはビューもコントローラも知らない。
- Model.....................AP本体
- View......................表示
- Controller................入力
MVCモデルの目的はアプリケーション本体とユーザインタフェースの明確な分離
にある。
changed-update メカニズム
一つのモデルに対して複数のビュー・コントローラを利用するために changed-update (dependency) を利用する
- コントローラが頑張るMVC
- 依存を利用したMVC
- プラガブルMVC
違いを比較するために、コントローラが頑張るMVCから見ていく。
コントローラが頑張るMVC
ユーザはコントローラに指示を出す。
- コントローラはモデルに変更メッセージを送る
- コントローラはビューに変更メッセージを送る
- ビューがモデルに状態を尋ねて再描画する
コントローラが制御の主体となる。
コントローラが頑張るMVCの問題点
一つのモデルに複数のビュー・コントローラが存在する場合を考える。
ユーザはコントローラ1に指示を出す。
- コントローラ1はモデルに変更メッセージを送る
- コントローラ1はビュー1に変更メッセージを送る
- ビュー1がモデルに状態を尋ねて再描画する
問題点
ビュー2は以前として古い情報を表示したままである。
正しくない解決方法
ユーザはコントローラ1に指示を出す。
- コントローラ1はモデルに変更メッセージを送る
- コントローラ1はビュー1に変更メッセージを送る
- ビュー1がモデルに状態を尋ねて再描画する
- コントローラ1はビュー2に変更メッセージを送る
- ビュー2がモデルに状態を尋ねて再描画する
なぜ正しくないか
ビュー・コントローラが増えれば破綻する。
依存を利用したMVC
モデル自身に変化があった場合には、モデルが自分自身にchanged: メッセージを送る。
すると、
dependency を通して自動的にモデルと依存関係にあるビューが再描画 (update:) される。
ユーザはコントローラ1に指示を出す。
- コントローラ1はモデルに変更メッセージを送る
- モデルは自分自身に changed: メッセージを送る
- dependency を通してすべてのビューに update: メッセージが送られる
- 各ビューがモデルに状態を尋ねて再描画する
なぜモデル自身に changed: を送るとビューが update: されるのか?
魔法があるわけではない。
Smalltalk-80 には、モデルとビューの依存関係を管理する辞書である
DependentsFields がある。
最近の Smalltalk には Model クラスに dependents を保持するインスタンス変数があり、依存関係の高速化を行なっている。
いずれにしても、モデルは、dependents
から自分のビューおよびコントローラを知ることができる。
dependency の表記
Observer Pattern である。
ビューの構成
ウィンドウは複合オブジェクトとして構成
- 一つのモデルにいくつかのビューを与えることができる (multiple panes, multiple views)
インスタンスツリー
プラガブルMVC
モデルとビュー・コントローラ間の対話を標準化し、様々なモデルに手軽に
利用できるようなインタフェースを実現する目的として、プラガブル
(Pluggable) MVCの概念がある。
モデルに依存しない、標準化されたビュー・コントローラをプラグインすることに
よって、定型的な MVC が簡単に構成できる。
また、一つのモデルをいくつかのサブビューに表示するために、各サブビューに機能を表わす名前
(aspect)を付け、モデルの変化に従ってどのビューを書き換えるか
を指示して、不必要な再描画の遅延を避けている。
- あらかじめよく使われるビュー・コントローラのメッセージを規定して、プラグを差し込むようにモデルと結合可能
- アダプタを利用して任意のメッセージを使用することも可能
一つのモデルを複数の視点(テキスト、ビットマップ、リスト等)から表示することを目的とする。
参考文献
- 青木 淳: Smalltalk ソフトウェア開発, SuperASCII,
Vol.2, No.6 - Vol.3, No.5 (1991-1992).
他の文献
Copyright (C) 1999 Hidetaka Masuda