MVC のベストプラクティス

モデル・ビュー・コントローラ (MVC) は、ほとんど全てのウェブ開発者が知っている言葉ですが、実際のアプリケーション開発において MVC を正しく使う方法を知らない人がいまだに沢山います。 MVC の背後にある中心的なアイデアは、コードの再利用性と関心事の分離 です。 この節では、Yii アプリケーションを開発するときにより良く MVC を守るための一般的なガイドラインをいくつか説明します。

ガイドラインをより良く説明するために、ウェブアプリケーションは以下のようないくつかのサブアプリケーションから構成されるものと仮定します。

サブアプリケーションは、モジュール の形式で実装されることもあれば、または、他のサブアプリケーションと何らかのコードを共有する Yii アプリケーションとして実装されることもあります。

モデル

モデル は、ウェブアプリケーションの基礎になるデータ構造を表します。例えば、LoginForm モデルは、アプリケーションのフロントエンドとバックエンドの両方で使われるでしょう。News モデルは、アプリケーションのコンソールコマンド、ウェブ API、フロントエンド、バックエンドで使われるでしょう。従って、

時として、上記の最後のルールに従ったために、単一のクラスに多くのコードを詰めすぎて、モデルが肥大化することがあります。 また、目的の違うコードを含んでいる場合も、モデルの保守が困難になり得ます。 例えば、News モデルは、フロントエンドでのみ使用される getLatestNews というメソッドを持つ一方で、同時に、バックエンドでのみ使用される getDeletedNews というメソッドも持つことが有り得ます。 小規模から中規模のアプリケーションでは、これでも構わないでしょう。 大規模なアプリケーションでは、モデルの保守性を高めるために、以下の方式を採用することが出来ます。

ですから、上記の例に対してこの方式を採用するとなると、フロントエンドのアプリケーションには getLatestNews メソッドだけを持つ News モデルを追加し、バックエンドのアプリケーションには getDeletedNews メソッドだけを持つ別の News モデルを追加することになります。

一般に、モデルはエンドユーザと直接に関係するロジックを持つべきではありません。もっと具体的に述べると、

ビュー

ビュー は、エンドユーザが望む形でモデルを表示する役割を持ちます。一般的に、

ビューはさまざまな方法で再利用が可能です。

コントローラ

コントローラ は、モデル、ビュー、その他のコンポーネントを結合して実行可能なアプリケーションを作るための接着剤です。 コントローラはエンドユーザのリクエストを直接に扱う役割を持ちます。従って、

設計の良い MVC アプリケーションでは、コントローラは非常に軽い、数十行のコードしか持たないものになる場合がしばしばあります。 その一方で、モデルは、データの表現と操作に関与するコードの大部分を抱えた、非常に重いものになります。 これは、モデルによって表現されるデータ構造とビジネスロジックがたいていはアプリケーション特有のものであり、アプリケーション固有の要求に応じるためにカスタマイズしなければならない所が多いことが原因です。 これに対してコントローラのロジックは多くのアプリケーションで共通のパターンに従うことが多く、従って、基礎になるフレームワークや基本クラスによって、かなり単純化することが出来ます。

$Id$