MVCと聞いていつも思うこと

 例えば下のスクリーンショットのようなアプリケーションがあったとする。このような場合、どれがモデルで、どれがコントローラで、どれがビューにあたるんだろう。

 wikipedia:Model View Controller によると MVC のシナリオは以下のようであるという。

MVCの実装は様々であるが、制御フローは一般的に次のようになる。

  • ユーザがユーザインタフェースを通してviewに入力する(ボタンを押すなど)。
  • controllerがviewからの入力イベントを処理する。controllerは登録されているイベントハンドラやコールバックを通して呼ばれることが多い。
  • controllerがユーザのアクションに応じてmodelのメソッドを呼ぶ。その結果modelのデータ(例えば、ショッピングカートの中身など)が書き換えられることもある。
  • viewがmodelから関連するデータを取得し、出力を更新する。例えば、ショッピングカートの中身の表示を更新する。
  • viewがユーザの次の操作を待つ。始めに戻って、新しいサイクルに入る。

 view に入力するって……なに? AI はコントローラとモデルのどちらにあたるんだろう? 物理演算はどれに該当するの?

 XOOPS Cube における MVC の適用議論で、長らく解釈に悩んでいたのが「モデル」だった。仕事では「モデル化して扱う」という言葉があるように、たとえばペリフェラルもすべてモデル化して扱うから、入力装置もモデルになる。コンボボーナスやスペシャルボーナス、隠し要素ボーナスなどがあれば、スコアリング処理さえスコアラーとしてモデル化する。そうしてモデル化したものをモデルと呼んでいる。

 この感覚でいった XOOPS Cube のひとつのメインシーケンスフレームワークである cubson では、入力をペリフェラルドライバである XCube_ActionForm で問題のない状態にしてから、そこから入力値を取り出し、データモデルとやり取りをするという方法をとっている。

 しかし、こういう考え方は Web エンジニアの方々に迷惑をかける結果に終わってしまった。また、 XOOPS Cube は交換可能性を追求した設計で、 cubson も別に内部に持っているわけではないので、すぐにプロの Web エンジニアから満足のいく同ジャンルのソフトが出るだろうと気楽に考えていたのもいけなかった。結局、 Web エンジニアの方々がしかめっ面しながら cubson と付き合うという状況を招いてしまった。

 これは業者の方に伺った話なのだけど、 IT/Web エンジニア的には、割とそういうものらしい。 OGRE3D コミュニティのようにバンバン代替品や新アイデアの実装品をリリースするというノリではなく、今あるものに合わせようという心意気があるらしい。

 そういう習慣があるとは知らなかったので、今のような状況は当初まったく想定していなかった。叩き台役だけではだめで、 MVC なり何なりを解釈して、少しでもまともなものを提供する必要がある。しかしそうやって MVC を考えるといつも上の疑問にぶちあたってしまう。

 しかし、少し以前から、 Web エンジニアリングもしくは MVC そのものでいう「モデル」とはwikipedia:データモデルのことなんじゃないか(あるいは、データモデルとして解釈すれば満足されるのではないか)と考え始めた。たとえば、 CakePHP のモデルクラスは、データモデルになっていて、データソースとやりとりをする部分が割とがっちり書かれているが、これを最初に見たときはものすごく衝撃的だった。

 あれが「モデル」だというなら、「コントローラ」の役割も非常に明快になる。あの概念では、ゲームとか組み込み系は作れない気がするが、そういうものが MVC というなら(あるいはそう解釈しても XOOPS 的に実害ないなら)、自分でも理解できる話になってくる。