MVCをWebに適用した「MVC2」

「MVC2」の構成とシナリオおよび「MVC」との違い。

「MVC」をWebに対応させた「MVC2」(MVCモデル2)がある。「MVC」は基本的にウィンドウベースのGUIに対応したものなので、Webにそのまま適用できない。よってWebに対応した「MVC2」が登場する。

「MVC2」もWebシステムではほとんどのベースとなっていて、こちらをMVCと思い込んでいる人もいるが違う。

構成とシナリオ

概要図とシナリオは次のとおり。

MVCモデル2概要図
Figure 1. MVCモデル2概要図

モデル2は次のようなシナリオで動作するように作る。(順番は図の番号と対応)

  1. ユーザがブラウザを通してフォームなど入力する。

  2. ユーザが入力したフォームデータなどをHTTPリクエストとして、ブラウザがコントローラへ送る。

  3. コントローラがモデルに状態を変更するように依頼する。

  4. コントローラが制御をビューに転送する。

  5. ビューがモデルの情報を取得し、最新の状態にしたページを生成する。

  6. ページがブラウザに返され、表示される。

「MVC」と「MVC2」の違い

概要図を並べると次のとおり。

MVC概要図
Figure 2. MVC概要図
MVCモデル2概要図
Figure 3. MVCモデル2概要図

「MVC」との違いは、「モデル」が「ビュー」に状態が変わったことを通知することがWebの性質上できなくなった点。サーバー側から「モデル」の状態変更が通知することがHTTPではできないので必然的にそうなる。これにともない「MVC」に比べ「モデル」構成の考え方が大きく変わる。

「モデル」が状態が変わったことを通知することができないことは、毎回最新の状態のモデルを作ることにつながる。「MVC」では前状態を保持しつつ状態変化に対応させるといった「モデル」の使い回しがしやすい。しかし「モデル2」では毎回最新の状態のモデルを作るので使い切りになる。

この「使い回し」か「使い切り」にするかにより、モデルを構成する状態やクラスの設計は大きく影響される。「使い切り」を前提とすると、DBから取得した値をどう保持するかに注力して満足してしまう。よって「MVC2」では、DBから取ってきた値を保持するだけのデータオブジェクトを中心にしてしまう設計が目立つ。そしてそれがドメイン貧血症につながる傾向にある(それだけが原因ではないが…)。

Appendix B: 改訂履歴

  • v1.0, 2013-09-03: 初稿