続: MVC
疑問メモ: MVC(http://d.hatena.ne.jp/torazuka/20121213/mvc)の続き。
身内から「ナーバスナイーブなコードでMVCを組み立てようとしたところで何の意味もねーぞ」と諭されて、考えることをほぼ諦めつつも、一応書き直しました。
MVCはアーキテクチャパターンなので、GOFのような実装パターンより、さらに抽象度が高いです。実装クラスを数個作って分かったつもりになろうというアプローチは、たしかにそもそも間違っていました。
以下は、前回の記事に頂いたコメントを読んで、考えたこと、調べたことのメモです。コメントくださったきしださん、shuji_w6eさん、ありがとうございます。
ViewがModelを持つ
Model
https://gist.github.com/4276401#comment-627792
Q. Viewを保持してよいのか?
A. ダメ、絶対。
イベントハンドラを登録するのが吉。最近のGUIだとバインディング機構があるので利用するのもあり。
View
Q. Modelを保持してよいのか? 相互に参照していることになる。
A. Yes, View -> Model の参照はOK、逆はNG
フィールドにViewのインスタンスを持つのをやめて、Modelにリスナーを登録することにしました。
バインディング機構というのは、たとえばXAMLやFXMLのことのようです。GUIを作りたいなら現代的な機構を使うべし、という話のようでもあります。
プッシュかプルか
ModelがViewに更新を通知する方法は、プッシュかプルかについて。
きしださん曰く、プッシュじゃない?とのことでした。
POSA本に載っていた微妙な指針は、こうでした。
一般論としては、SubscriberがPublisherの情報を必要とする場合には、プッシュモデルの方が適したモデルであることが大半である。個々のSubscriberが、情報を必要とするかどうか、そして、いつ必要とするかを決定する場合に、プルモデルを使用する。
F・ブッシュマン他:『ソフトウェアアーキテクチャ』,近代科学社,p.335,2000.11.
# MVCを扱った章ではなく、Publisher-Subscriber章の文章ですが、イベント発生時の更新の伝播に着目すれば、ModelはPublisherで、View(とController)はSubscriberといえるので、参考にしてもよいと思います。
また、ついつい「プッシュかプルか」に二分して考えがちですが、その間に様々なバリエーションがあることも忘れてはいけないようです。
どのコンポーネントから作るか
Main
https://gist.github.com/4276401#comment-627792
Q. 最初のViewとModelの作成方法がよくわからない。どれから作るのか?
A. どっちでもいいんじゃない?
自分なら、独立しているのはModelだからModelかなぁ。
Swingアプリとかだと、Modelの構築をmainスレッドで行い、完了してからEDTでViewを組み立てる方が楽。
Modelが不完全な場合のViewの振る舞いを実装せずにすむから。
POSA本の「MVCのコンポーネントを初期化するシーケンス図」では、まずModelをインスタンス化して、次にViewをインスタンス化し、その初期化処理でModelの参照を渡しています。
実用上の理由としては、きっとshuji_w6eさんが書いてくださったとおりかと思います。
また、「Modelは処理のコアを担う」という理屈で、先に作るという考え方もありかもしれません。
…というわけで、最初のコードはViewから作っていたので、忘れないように順番を変更しておきました。
ひとまず、ここまでです。
「どうしてもアーキテクチャパターンを単独で見たいなら、言葉の意味が多重定義されて分かりづらいMVCよりも、MVVMを見るべし」というアドバイスを内輪でもらったので、そちらを見てみます。