2011.07.06 yossy a.k.a. 会長
はいどうも~。季節の変わり目のせいかゲホゲホが止まらないエンジニアの吉田です。
今回は、「MVC」と「MVC2」について改めて考えてみたいと思います。
Webアプリケーション開発では、よく「MVC」という言葉を耳にしますね。
「モデル」「ビュー」「コントローラ」の頭文字3文字をとって「MVC」です。
でも、「MVC」の話をしているのに、なんだか話が噛み合わないことがあるんです。
よくよく話を聞いていると、多くの場合、それは「MVC」と「MVC2」の混同です。
というわけで、「MVC」と「MVC2」の違いについて改めて考えてみたいと思います。
そもそも「MVC」という言葉は30年ほど前(1979年頃)からあり、最初はSmalltalkの
ウィンドウプログラム開発の設計指針として生まれたものです[※1]。
なので、「MVC」はもともとGUIのソフトウェアに適用するためのアーキテクチャなんですね。
今回は、広義の「MVC」と区別するために、これを「Smalltalk MVC」と呼ぶことにします。
(「MVC2」と区別するために「MVC1」と呼ばれることもあります。)
「Smalltalk MVC」での「モデル」「ビュー」「コントローラ」は次のような位置づけです[※2]。
・モデル:
画面に表示したいデータだけを持つオブジェクト。
「いつ、どこに、どのように表示されるのか」という情報は持っていない。
データの管理だけを専門に行う。
・ビュー:
モデルが持っているデータを表示するためオブジェクト。
「いつ、どこに、どのように表示されるのか」ということだけに専念する。
・コントローラ:
「モデル」と「ビュー」を操作するために、ユーザからの要求を受け付ける。
「モデル」と「ビュー」に指示を与えるためのオブジェクト。
「Smalltalk MVC」では、「ビュー」と「モデル」でObserverパターン[※3]の関係になっています。
そのため、「モデル」の値が変化したタイミングで「ビュー」を更新することが容易です。
[※1] cf. 「Model-view-controller - Wikipedia」
[※2] cf. 「使わないと損をするModel-View-Controller」
[※3] cf. 「Observerパターン - Wikipedia」
「MVC2」でググってみると「Marvel vs. Capcom 2」ばかりがヒットしますがこれは違います。
「MVC2」は、「Smalltalk MVC」の構造を参考にして、Webアプリケーションに適用したものです。
(「MVCモデル2」とか「MVCモデル2パターン」とかいろんな呼び方がありますが、
ServletなどのサーバサイドなJava界隈でよく使われている言葉です。)
「MVC2」での「モデル」「ビュー」「コントローラ」の位置づけは「Smalltalk MVC」と
同等ですが、「MVC2」では「ビュー」と「モデル」がObserverパターンの関係ではありません。
そもそもWebアプリケーションなので、毎回HTTPリクエストを経由する必要があり、
Observerパターンなんて使えるわけがありません。
(Ajax使って似たような考え方を適用することはできるかもしれませんが)
「MVC2」はWebアプリケーションのサーバサイド処理をするうえで、「データ」と「UI」を分離する考え方。
ただそれだけなのです。
一般的なWebアプリケーションの流れで説明すると、
「コントローラ」がHTTPリクエストを受け付け、
「モデル」がDBからデータをとってきてデータ処理を行い、
「ビュー」が「モデル」のデータを元にHTMLへ整形する
ということになります。
大概のソフトウェア構造はシンプルに考えると「入力」「処理」「出力」の3つで構成されています。
「Smalltalk MVC」でも「MVC2」でもこの大きな流れは同じだと思います。
なので、広義の「MVC」という言葉は、このシンプルな流れに当てはめてみると、
・「コントローラ」は「入力」を受け付け
・「モデル」はデータの「処理」を行い
・「ビュー」が見た目を整形して「出力」する
ということになりそうです。
PHPなどのサーバサイドWebアプリケーションで「MVC」というと「MVC2」のことを
指している場合が大半ですが、最近はJavaScriptでUIを処理することも増えてきたので、
ブラウザの中で「Smalltalk MVC」アーキテクチャを参考にできることもあるかもしれませんね。
というわけで、「MVC」という言葉を聞いた時には、「Smalltalk MVC」をイメージする人と
「MVC2」をイメージする人がいるので、どの「MVC」を指しているのかを文脈から
察することが大切かもしれません。
デワデワ。