MVC について思うこと -巷間にあふれる説明に対する疑問-
2009/10/02 22:21 - AS3.0
今まで書籍やウェブサイトなどの媒体で MVC についての知識を漁ってきました。
それらの内容を総合するに、M、V、C の各要素について端的に言うと、以下のようになるのではないでしょうか(アプリケーション開発者のためのActionScriptワークショップ和訳(バスキュールによる)、IT用語辞典、ウィキペディア等を参照)。
- Model
- データの保持
- Controller
- ユーザ入力に反応
- View
- Model を形にする
そして、たいていの場合 MVC パターンの模式図は Model、View、Controller の三点を頂点とした三角形で表現されています(設計 - MVCモデル、MVCモデル、MVCの3つ組などを参照。"MVC" をキーワードにして Google 画像検索するといくらでも出てきます)。
ところで上の定義をみると、View は Model の内容を視覚化するためのもの、となっています。
じゃあ「ユーザ入力を司る視覚要素」は何に分類されるんだ? という大きな疑問がここで湧いてきませんか?
ユーザが文字を入力するテキストフィールドやその他の各種フォーム、あるいは入力を確定するためのボタンといったものは、断じて Model の内容を形にするものではありません。むしろ逆に、Model の内容を変更させるものです。
Model の内容変更を司るのは何か? それは Controller です。
では、「ユーザ入力を司る視覚要素」は Controller である、ということでよろしいか?
「ActionScript 3.0 デザインパターン」は、それでよろしい、と言っています(P50~72)。
ここでは時計を使って MVC パターンが説明されています。 トグルボタンを押すと文字盤がアナログとデジタルに切り替わるようになっており、また、時、分、秒それぞれを adjust するための3つのテキストフィールドがあり、そのいずれかに数字を入れフォーカスを外すと Model である時計の現在時が変わるようになっています。
そしてこのトグルボタンとテキストフィールドは Controller クラスで定義されているのです。
でも何か釈然としないんだよなー、Controller に視覚要素が含まれるのって。視覚要素なら View じゃないの? って考えるのが自然じゃありません?
で、いろいろ悩んできたんですが、結局、View は二つに分けて、それぞれ別物として考えるべきなんじゃないか、という結論に達しました。
- ユーザ入力を Controller に伝えるための入力用 View
- Model の情報を受け取って表示を変える出力用 View
この考え方を導入すると MVC について、すんなり理解できるように思えるんですよ。
例えば Controller の機能の一つに「ユーザ入力に基づいて View に対して表示のみの変更を要求する」というのがあります。この「Controller から View への情報の逆流」というのがどうしても理解できませんでした。
だいたい Model の内容を表示するために存在するのが View であるならば、なんで Controller が View に対して(表示に関わる部分だけとはいえ)ちょっかい出す余地があるのか、また出せるように設計するのか、その必然性が理解できない、そういう事例が思い浮かばない。
また View という一つの要素が Model と Controller というまったく異なる複数の要素から変更を加えられるという設計は、オブジェクト指向的には如何なものかとも思うんですよ。
しかし入力用 View と出力用 View という2つの概念を導入すれば理解できます。
例えば入力のためのボタンが複数あって、一度押されたボタンは他のボタンが押されるまで無効になる、というような場合、Model からではなく、Controller から制御するのが自然です。
「Head First デザインパターン」では MVC をリズムマシンで説明しています(P456~489)。 ここでは以下の2つの View が設定されています。
- リズムマシンの起動や停止、リズム速度の変更など、ユーザ入力をおこなう View
- 現在のリズム速度とリズムに合わせた振動バーを表示する View
この入力用 View と出力用 View は異なるウィンドウになっているのですが、この本では、一つの View クラスから生成されるようコーディングされています。
でもこれって違うウィンドウなんだから、一つのクラスまとめないで、別々のクラスにすればいいんじゃないかなぁ。
結果的に入力用の View と出力用の View が同一オブジェクト上に実装される、ということはあり得ます。 でも理論説明や設計考慮の段階では、3つの頂点を持った三角形ではなく、4つの点を持った図形で考えると、より自然に MVC が理解できるのではないか、と考える次第です。
私の考える MVC 模式図
その他の資料
- FLASH OOP for ActionScript 3.0
(P195~198)
シリーズ
- MVC ってこういうこと?(5) -取りあえずのまとめ-
- MVC ってこういうこと?(4) -Controller-
- MVC ってこういうこと?(3) -View-
- MVC ってこういうこと?(2) -Model-
- MVC ってこういうこと?(1) -前説-