MVCモデルとは

 Webアプリケーションを作る際によく使われるのが、MVCモデルです。今回は、このMVCモデルに焦点を当ててみます。

MVCとは

  • Model
  • View
  • Controller

 の頭文字を取ったモデルで、主にクライアント・サーバーシステムを構築する際に使われるデザインパターンです。

 それぞれの層を明確化することにより、明瞭かつ改修しやすいプログラムを作ることが目的です。

 プログラム設計の上では、役割を持たせることはとても大切ですが、MVCモデルというひとつの共通認識により役割の伝達をしやすくする、というのは合理的ですね。

View

 専ら、画面への表示を担当する層です。コード上ではjavaのJSPや、ASP.NET MVCにおけるRazorなどのテンプレートエンジン、Ajax通信を主とするHTML+JavascriptなどがViewにあたります。

 誤解を恐れずに言うと、ユーザーが見える範囲全てがViewと言っても差し支えありません。

 過去に、ここにビジネスロジックや、果てはデータベースアクセスまで書いているプログラムを見かけましたが、重罪です。絶対にやめておきましょう。

Controller

 Controllerは、ViewとModelの橋渡し役です。ここにビジネスロジックを書くのも避けるべきです。

 よく、Controllerの定義を誤って解釈している人がいますが、MVCモデルは、「三層クライアントサーバシステム」の「ファンクション層」ではありません。混同しないように気をつけてください。

 Viewから受け取ったフォームの値や、JSONなどをModelに渡したり、逆にModelから貰った値をViewに渡したりしたりするのが役割です。MVCの中では、最もシンプルなコーディングになるはずです。

Model

 それ以外の全てです。

 ざっくりすぎますが、データベースアクセスからビジネスロジックまでの全ての処理を担います。

 しかし、いくらなんでも、全てmodelパッケージに突っ込んでしまうと、複雑なシステムは非常に読みづらくなってしまいます。

 そのため、modelの中でも、いくつかの役割を分けてシステムを構築する必要が出てきました。いくつか紹介します。

DAO

 Data Access Objectの略で、専らデータベースアクセス処理を担うのがこのクラスです。煩雑になるビジネスロジックからこの処理を排除する事で、よりシンプルになりました。

 もし、データベースを変更(例えばカラム名の変更)することになっても、DAOさえ変更すればよいので、影響範囲の調査も容易です。

Service

 ビジネスロジックすら分けてしまおうと考えたのがサービスクラスです。オブジェクト指向といえば、privateフィールドに対して値を変更するのが基本だったわけですが、それらのメソッドを全て外に出し、フィールドを後述するDTOに纏めてしまえば、より疎結合なシステムを設計する事ができると考えました。

 このように、ビジネスロジックを全てサービスクラスに格納したシステムもありますが、そうでないものも多数あります。プロジェクトによって最も認識に差異があるのがサービスクラスかもしれません。

DTO

 以下の記事で詳しく説明していますので、概要に留めます。

 WebアプリケーションをMVCモデルで本格的に作ることになると、しばしば耳にする不思議な言葉があります。 DTOとは  Data Tr...

 DAOやサービスクラスの登場により、オブジェクトにメソッドが必要なくなりました。それならシンプルにしてしまえばよい、と登場した、ただの箱です。

最後に

 一口にMVCモデルと言っても、時代の変遷やフレームワーク、プロジェクトの方針により大きく変わります。ですので、何が正しい、何が間違っている、ということは一概には言えません。

 こういった引き出しを増やすことで、システムによって最適な選択肢を選んでいければと考えています。

 設計は簡単ではありませんが、適切な判断のために、インプットは欠かさないようにしたいものです。