MVC ってこういうこと?(2) -Model-
2009/10/04 21:22 - AS3.0
MVC を学ぶシリーズ、前回は実際にコードを組んで wonderfl にあげてみました。
今回からは、そのコードについての解説を始めます。
このコードは以下のクラスから成り立っています。
- ドキュメントクラス
- Model のクラス
- Controller のクラス
- View のクラス
- 入力用 View のクラス
ここで、使用する用語について、きちんと定義しておきたいと思います。
前々回、View を2つに分け、別物として考えると理解しやすいんではないか、ということを書きましたが、今後は出力用の View を 「View」、ユーザ入力を受け持つ View を「入力用の View」と呼称することにします。
なぜ出力用 View が無印で、入力用は改まって「入力用」としているかというと、まだ入力用視覚要素の扱いに迷っているからです。View に所属させるのか、それとも Controller に所属させるのか。
それはさておき、個別要素の説明の初回は、プログラムの心臓部 Model から始めます。
まず、この Model は何をしているのかというと、その内部に持った3つの Number 型メンバ変数を、以下の2つのタイミングで加算する。ただそれだけです。
- 自律的な加算
- Model 内部の Timer により、一定期間毎に3つの変数を同時に 0.5 ずつ加算
- 他律的な加算
- 他者からの介入によるもので、いずれか一つの変数に 15 を加算
そして、自律、他律に関わらず、メンバ変数に変更が生じた場合、Event.CHANGE を発効します。
次は他者との関わり合いについて。
Model は View と Controller、その2つと関わり合いを持っていますが、それは「View へ働きかける」、「Controller から働きかけられる」という関係になっています。
「View への働きかけ」についてですが、一般的には「Model は Observer パターンによって、View への参照を持つ」という説明がなされています。 しかし、Model はできる限り「閉じた設計」の方が良いと思えたので、今回のコードでは Model は他者の参照を持たない設計にしました。
じゃあどのようにして Model は View に状態変更を通知しているのか、というと、先ほど書いたようにイベント駆動で解決します。
つまり、こういうことになるんじゃないでしょうか。
あたしの名前は MVC の Model。
他人には興味ありません。
この中に私の動向が気になって仕方のない者がいたら、あたしのメッセージを勝手に受け取りなさい。
以上!(平野綾の声で)
Model が View に働きかけるんじゃなくて、View が Model をストーキングしている状態ってな感じですかねー。
言ってみりゃあ、「フォローしている」が0で、「フォローされてる」が10,000な Twitter アカウントみたいなもん?
さて、そんな自分大好きっ娘な Model ですが、ユーザインタラクティブが必要な場合、Model に対して何らかの影響を与える必要があるわけです。それが Model と Controller との関係です。
しかし他人に興味のない Model に一体どうやって働きかけるのか。
こういうことになるんじゃないでしょうか。
あたしの名前は MVC の Model。
あたしに何かさせたい者がいたら、決まった手続きを取りなさい。
以上!
この「決まった手続き」というのは、Model のメソッドを呼び出すということです。
つまり「あたしが他人から言われて何かすると言っても、あたしのやることはあたしの権限で決めること。他人が好き勝手できるワケじゃないのよ」ってなとこでしょうか。
Model は他者の参照を持たず、Model のメソッドを呼び出す側である Controller が Model の参照を持ちます。 しかしこの「Controller が Model の参照を持つ」というのは、これは先ほど述べた View が Model の参照を持つということとは全く意味が異なる点は注意しておくべきでしょう。
ハルヒに働きかけることができるのはキョンだけのように、Model に働きかけて良いのは Controller だけです。Model のメソッドを呼び出す目的で Model の参照を持つのは Controller だけ。 大事なことなので2回言いましたよ(by みの)。
え? 譬えがわからん? 「涼宮ハルヒの憂鬱」調べてね。
ところで Model のメソッドを呼び出していいのは Controller だけと言っても、View も Model への参照を持っているから、Model のメソッドにアクセスできちゃうんだよね。
ということは、View には Model の参照を持たせないで、Model が Observer パターンで View の参照を持つ設計の方が優れているのかなー、と徐々に反省しつつあり。
でも今はとりあえず View に Model の参照を持たせて、イベントでつなぐやり方にしておきます。
以上を踏まえた Model のコードは以下のとおりです。
シリーズ
- MVC ってこういうこと?(5) -取りあえずのまとめ-
- MVC ってこういうこと?(4) -Controller-
- MVC ってこういうこと?(3) -View-
- MVC ってこういうこと?(1) -前説-
- MVC について思うこと -巷間にあふれる説明に対する疑問-