続: MVC

疑問メモ: MVChttp://d.hatena.ne.jp/torazuka/20121213/mvc)の続き。

身内から「ナーバスナイーブなコードでMVCを組み立てようとしたところで何の意味もねーぞ」と諭されて、考えることをほぼ諦めつつも、一応書き直しました。

MVCアーキテクチャパターンなので、GOFのような実装パターンより、さらに抽象度が高いです。実装クラスを数個作って分かったつもりになろうというアプローチは、たしかにそもそも間違っていました。

以下は、前回の記事に頂いたコメントを読んで、考えたこと、調べたことのメモです。コメントくださったきしださん、shuji_w6eさん、ありがとうございます。

ViewがModelを持つ

Model
Q. Viewを保持してよいのか?
A. ダメ、絶対。
 イベントハンドラを登録するのが吉。最近のGUIだとバインディング機構があるので利用するのもあり。
 
View
Q. Modelを保持してよいのか? 相互に参照していることになる。
A. Yes, View -> Model の参照はOK、逆はNG

https://gist.github.com/4276401#comment-627792

フィールドに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
Q. 最初のViewとModelの作成方法がよくわからない。どれから作るのか?
A. どっちでもいいんじゃない?
 自分なら、独立しているのはModelだからModelかなぁ。
 Swingアプリとかだと、Modelの構築をmainスレッドで行い、完了してからEDTでViewを組み立てる方が楽。
 Modelが不完全な場合のViewの振る舞いを実装せずにすむから。

https://gist.github.com/4276401#comment-627792

POSA本の「MVCコンポーネントを初期化するシーケンス図」では、まずModelをインスタンス化して、次にViewをインスタンス化し、その初期化処理でModelの参照を渡しています。

実用上の理由としては、きっとshuji_w6eさんが書いてくださったとおりかと思います。

また、「Modelは処理のコアを担う」という理屈で、先に作るという考え方もありかもしれません。

…というわけで、最初のコードはViewから作っていたので、忘れないように順番を変更しておきました。

ひとまず、ここまでです。

「どうしてもアーキテクチャパターンを単独で見たいなら、言葉の意味が多重定義されて分かりづらいMVCよりも、MVVMを見るべし」というアドバイスを内輪でもらったので、そちらを見てみます。