MVC (Model-View-Controller)は、Smalltalk-80から生じたデザインパターンです。MVCでは、図 1-2に示されているように、アプリケーションにおける3つのタイプのオブジェクトを提案しています。各タイプは抽象的な境界で区切られ、その境界をまたがってやり取りするようになっています。これは、オブジェクト指向プログラムの多くのデザインの背後にあるデザインパターンです。このデザインパターンは、保守しやすく拡張可能な分かりやすいシステムの開発を支援します。
モデルオブジェクト
ビューオブジェクト
コントローラオブジェクト
ハイブリッドモデル
このタイプのオブジェクトは、特別な知識や専門技術を表します。モデルオブジェクトは、データを保持し、それらのデータを操作するロジックを定義します。たとえば、業務アプリケーションでよく使われる、顧客オブジェクトというオブジェクトをもっているとします。このオブジェクトは、顧客の氏名、誕生日、電話番号など、その顧客についての重要な事実をすべて保持しています。このオブジェクトは、アプリケーションが操作するデータを表現しているためモデルオブジェクトであり、その情報にアクセスして配布できるメソッドにアクセスします。より専門化されたモデルとしては、Frontという気象システムで使われているものがあります。この種のオブジェクトは、前線を表すデータと情報を含んでいることが考えられます。モデルオブジェクトは、アプリケーションのユーザから直接アクセスされることはありません。多くの場合、再利用可能で、配布され、永続的であり、各種のプラットフォームに移植可能です。
ビューオブジェクトは、ユーザインターフェイス上の目に見える要素を表します(たとえば、ウインドウやボタンなど)。ビューオブジェクトは、それが表示するデータの出所を知りません。Cocoaを構成しているフレームワークの1つであるApplication Kitが、通常は 必要な基本のビューオブジェクト(ウインドウ、テキストフィールド、スクロールビュー、ボタン、ブラウザなど)をすべて提供します。しかし、新しい方法で独自のデータを提供または表現するビューオブジェクト(たとえばグラフビューなど)を独自に作成することもできます。また、複数のビューオブジェクトを、アプリケーション固有のやり方で1つのウインドウにグループ化することもできます。ビューオブジェクトは非常に再利用しやすい場合が多く、複数のアプリケーションに一貫性を持たせることができます。
アプリケーションにおいてモデルオブジェクトとビューオブジェクトの間の仲介役となるのが、コントローラオブジェクトです。コントローラオブジェクトは、モデルオブジェクトとビューオブジェクトの間でデータの受け渡しを行います。たとえば、(顧客モデルオブジェクトから)ウインドウの可視テキストフィールド(ビューオブジェクト)への住所の転送を仲介する場合などが考えられます。また、それが属しているアプリケーション固有のあらゆる作業も実行します。コントローラの役割はアプリケーションに非常に特化しているため、アプリケーションのコードの大部分を占めることが多いにもかかわらず、通常は再利用性がありません(ただしこれは、コントローラオブジェクトは再利用できないという意味ではなく、優れたデザインであれば再利用できます)。コントローラが中心的な仲介の役割を果たすため、モデルオブジェクトはユーザインターフェイスの状態とイベントについて知る必要がなく、ビューオブジェクトもモデルオブジェクトのプログラムインターフェイスについて知る必要がありません。自分のビューオブジェクトとモデルオブジェクトを、他のデベロッパがInterface Builderのパレットから利用できるようにすることもできます。
MVCを厳守することが、必ずしも最善の解決策ではない場合があります。規則を組み合わせるのが最適な場合もあります。たとえば、業務用ゲーム機のように大量のグラフィックス処理を行うアプリケーションでは、ビューとモデルの役割を統合した複数のビューオブジェクトを使うことなどが考えられます。いくつかのアプリケーション、特にシンプルなアプリケーションでは、コントローラとモデルの役割を組み合わせることができます。このようなオブジェクトは、モデルオブジェクトの特殊なデータ構造とロジックを、インターフェイスへのコントローラのフックと結び付けています。
Last updated: 2008-01-24