MVCと聞いていつも思うこと
例えば下のスクリーンショットのようなアプリケーションがあったとする。このような場合、どれがモデルで、どれがコントローラで、どれがビューにあたるんだろう。
wikipedia:Model View Controller によると MVC のシナリオは以下のようであるという。
MVCの実装は様々であるが、制御フローは一般的に次のようになる。
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 的に実害ないなら)、自分でも理解できる話になってくる。