Cocoa Core Competenciesによる Model-View-Controller
Model-View-Controller (MVC) 設計パターンは、アプリケーション内のオブジェクトに、モデル、ビュー、またはコントローラーの 3 つの役割のいずれかを割り当てます。パターンは、オブジェクトがアプリケーションで果たす役割を定義するだけでなく、オブジェクトが相互に通信する方法を定義します。3 つのタイプのオブジェクトはそれぞれ、抽象的な境界によって他のタイプから分離され、それらの境界を越えて他のタイプのオブジェクトと通信します。アプリケーション内の特定の MVC タイプのオブジェクトのコレクションは、レイヤー (モデル レイヤーなど) と呼ばれることがあります。
MVC は、Cocoa アプリケーションの優れた設計の中心です。このパターンを採用する利点は数多くあります。これらのアプリケーションの多くのオブジェクトは、より再利用可能になる傾向があり、それらのインターフェースはより適切に定義される傾向があります。MVC 設計のアプリケーションは、他のアプリケーションよりも簡単に拡張できます。さらに、多くの Cocoa テクノロジとアーキテクチャは MVC に基づいており、カスタム オブジェクトが MVC の役割の 1 つを果たす必要があります。
モデル オブジェクト
モデル オブジェクトは、アプリケーションに固有のデータをカプセル化し、そのデータを操作および処理するロジックと計算を定義します。たとえば、モデル オブジェクトは、ゲームのキャラクターやアドレス帳の連絡先を表す場合があります。モデル オブジェクトは、他のモデル オブジェクトと対 1 および対多の関係を持つことができるため、アプリケーションのモデル レイヤーが実質的に 1 つまたは複数のオブジェクト グラフである場合があります。アプリケーションの永続状態の一部であるデータ (永続状態がファイルまたはデータベースに格納されているかどうか) の多くは、データがアプリケーションに読み込まれた後、モデル オブジェクトに存在する必要があります。モデル オブジェクトは特定の問題領域に関連する知識と専門知識を表すため、同様の問題領域で再利用できます。理想的には、
通信:データを作成または変更するビュー レイヤーでのユーザー アクションは、コントローラー オブジェクトを介して通信され、モデル オブジェクトの作成または更新が行われます。モデル オブジェクトが変更されると (たとえば、ネットワーク接続を介して新しいデータを受信した場合)、コントローラー オブジェクトに通知され、適切なビュー オブジェクトが更新されます。
オブジェクトを表示
ビュー・オブジェクトは、ユーザーが表示できるアプリケーション内のオブジェクトです。ビュー オブジェクトは、それ自体を描画する方法を認識しており、ユーザーのアクションに応答できます。ビュー・オブジェクトの主な目的は、アプリケーションのモデル・オブジェクトからのデータを表示し、そのデータを編集できるようにすることです。それにもかかわらず、ビュー オブジェクトは通常、MVC アプリケーションのモデル オブジェクトから切り離されます。
通常は再利用して再構成するため、ビュー オブジェクトはアプリケーション間の一貫性を提供します。UIKit フレームワークと AppKit フレームワークの両方がビュー クラスのコレクションを提供し、Interface Builder はそのライブラリで多数のビュー オブジェクトを提供します。
通信:ビュー オブジェクトは、アプリケーションのコントローラー オブジェクトを通じてモデル データの変更を学習し、ユーザーが開始した変更 (テキスト フィールドに入力されたテキストなど) を、コントローラー オブジェクトを通じてアプリケーションのモデル オブジェクトに伝達します。
コントローラ オブジェクト
コントローラ オブジェクトは、アプリケーションの 1 つ以上のビュー オブジェクトと 1 つ以上のモデル オブジェクトの間の仲介者として機能します。したがって、コントローラ オブジェクトは、ビュー オブジェクトがモデル オブジェクトの変更を学習する経路であり、その逆も同様です。コントローラー オブジェクトは、アプリケーションのセットアップおよび調整タスクを実行し、他のオブジェクトのライフ サイクルを管理することもできます。
通信:コントローラー オブジェクトは、ビュー オブジェクトで行われたユーザー アクションを解釈し、新しいデータまたは変更されたデータをモデル レイヤーに伝達します。モデル オブジェクトが変更されると、コントローラー オブジェクトはその新しいモデル データをビュー オブジェクトに伝達して、表示できるようにします。