仕事でMVCやプレゼンテーション部分のアーキパターンについての話題が挙がったので、真面目に調べてみました。ということでノート代わりにここを使用します。間違っていたら指摘して下さいね。
1. 発祥
1978年にSmalltalkを開発していたXerox社の研究所で生まれる。その後、MVCの実装を記述した論文「Applications Programming in Smalltalk-80(TM):How to use Model-View-Controller」が発表されるとその有用性から多方面へと広がる。
2. 構造
UIの構造やビジネスロジック(データ含む)などの利害関係の異なるそれぞれの要素に対し、どのようにすればそれらを奇麗に分離することができるのか?という問題に対する一つの解として登場したのがMVCです。MVCではビジネスロジックやUI、ユーザからの入力の三つ(つまり、処理/出力/入力)をそれぞれModel/View/Controllerの3つの要素に分離し、役割を設けます。
Model |
ドメイン(ドメインレイヤーではない)についての情報や捜査を担当する要素。主にビジネスロジックを実装します。 |
View |
ユーザへの情報の表示を担当する要素(UI)。Modelのデータを出力します。 |
Controller |
ユーザからのアクションを受け、ModelやViewの操作を担当する要素。 |
※ 実線は直接的な関連性、点線は間接的な関連性を示す。
3. 分離と依存性
MVCの最も重要な点として、Presentation(ViewとController)とModelの分離が挙げられます。ModelをPresentationから独立させ、更にPresentationに依存させないことにより次のメリットが得られます。
- Modelにおける処理が簡素化される。
- Model単体でテストを行うことが可能である。非UI要素なので、単体テストも比較的容易に可能である。
- Presentationの修正をModelをいじらずに行うことが可能となる。
尚、Modelに関しては「Passive Model」と呼ばれるパターンと「Active Model」と呼ばれる二つのパターンが存在します。Passive ModelはModelがControllerによって排他的に使用される場合は使用することができます。例えば、Webアプリケーションなどは基本Modelのデータは顧客単位で保持している場合が多く、この場合ModelはControllerより(実質的に)排他的に利用されると考えてよい。とうぜんModelを共有する可能性が出てくる場合もあるが、楽観ロックや悲観ロック等で同時実行制御を行うことで問題を回避することができる。
一方、複数のViewからModelを参照し、そのどれかのControllerによりModelが更新され、その更新を各Viewに反映する必要がある場合Passive Modelを使用することはできません。Modelの変更をController抜きにViewへ反映する必要がある場合、「Active Model」を使用することになります。Active Modelでは、Modelの変更をViewに反映する必要があることから、Modelに依存しているViewを管理するどこかで必要があります。Model要素にView要素への直接的な依存性を持たせてしまうと、Model View Controllerと分離させた意味が無くなってしまうので、依存性を管理するコレクションを利用したり、Observerパターンを利用することによりViewとModelの直接的な依存性を回避する必要があります。
(ちなみに、この辺でよくある勘違いとして、PresentationがModelに依存しないと思ってしまう人がいます。これは大きな間違いで、PresentationとModelは分離しても、PresentationからModelへの依存性は必ず発生します。重要なのはModelからPresentationへの依存性を無くすことです。というか、依存性無しじゃプログラム作れないよっ)
もう一つViewとControllerの分離もありますが、こちらはPresentationとModelの分離ほど重要視されていません。これはViewとControllerを明確に分離すること自体難しい場合が多いからです。(ただWebアプリケーションなどはそうも言ってられないみたいですが…)
4. MVCの実装と派生パターン
MVCの実装方法としてはPage ControllerやFront Controllerパターン、MVCからの派生パターンとしてMVP(Model View Presenter )があります。が、まだしっかりと調べきっていないので、また次の機会に説明します(;´Д`)
参考文献
[1] Model-view-controller wiki
[2] MVC - XEROX PARC 1978-79
[3] Applications Programming in Smalltalk-80(TM) : How to use Model-View-Controller
[4] モデルビューコントローラ MSDN
[5] Martin Fowler, エンタープライズアーキテクチャパターン, ISBN4-7981-0553-8
[6] GoF, デザインパターン, ISBN4-7973-1112-6
# 書き始めたころに大きな地震がありました。またもや新潟らしいです。北陸地方の人大丈夫ですかね…