MVCをWebに適用した「MVC2」

構成とシナリオを確認しつつ、「MVC」との違いを考えるながら特徴をまとめる。

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

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

構成とシナリオ

MVCとは違い「モデル」から「ビュー」への通知がなくなる。

MVCモデル2概要図

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

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

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

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

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

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

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

「MVC」と「MVC2」の違い

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

「モデル」が状態が変わったことを通知することができないことは、毎回最新の状態のモデルを作ることにつながる。「MVC」では前状態を保持しつつ状態変化に対応させるといった「モデル」の使い回しがしやすい。しかし「モデル2」では毎回最新の状態のモデルを作るので使い切りになる。この「使い回し」か「使い切り」にするかにより、モデルを構成する状態やクラスの設計は大きく影響される。「使い切り」を前提とすると、DBから取得した値をどう保持するかに注力して満足してしまう。

よって「MVC2」では、DBから取ってきた値を保持するだけのオブジェクトを中心にしてしまう設計が目立つ。それがドメイン貧血症につながる傾向にある(それだけが原因ではないが…)。