- モデルは単なるデータであり、データの変更を通知します。
- ビューはモデルのメッセージを読み取り、ビューを更新します。
- コントローラは、ビューからユーザー入力を読み取り、それに応じてモデルを変更します。
モデルは単なるデータではありません。モデルはビジネスロジックでもあります。これには、システムのすべてのインテリジェンス、または少なくとも舞台裏のインテリジェンス(データベース呼び出しやその他のサービス呼び出しなど)の抽象化が含まれています。「モデルを重くし、コントローラーを軽くしてください」ということわざを考えてみてください。
- モデルは誰も知りません。
- ビューはモデルを知っています。
- コントローラは、ビューとモデルの両方を認識しています。
モデルは、それが正しいことを誰も知りません。モデルはアプリケーション間で移植可能である必要があり、UIの懸念にまったく依存しないようにする必要があります。(この場合、ビューとコントローラーはUIの問題です。)
ビューはモデルを認識しており、これも正しいです。ビューは基本的にモデルに「バインド」されます。すべてのUI要素を表示し、それに応じてモデルデータをUI要素内に配置します。
コントローラは「ビューを知っている」ようなものです。どのビューに直接制御するかはわかりますが、そのビューについては何も知りません。また、以前にどのコントロールからどのビューが来たのかもわかりません。コントローラはイベントに応答します。イベントはUIから着信し、ある種の状態情報(おそらく、ViewModel)を運び、モデル(ビジネスロジックが発生する場所)を介して論理制御を指示し、モデル(または形状の場合はViewModel)で応答します。特定のビューに固有のデータは、モデルとは異なります)およびビュー。
ビューがモデルを直接変更できない理由はわかりませんが、コントローラーを介して変更できます。
ビューは、ユーザーインタラクションのコンテキスト内でモデルを操作できますが、これらの変更が何らかの形で持続することを期待するべきではありません。ビューは「クライアント側」と見なされるべきであり、「サーバー側」については何も知りません。(Webアプリケーションではなく、ネイティブアプリケーションについて話している場合でも。)変更を永続化することは、UIの「アクション」または「イベント」と見なされ、コントローラーに送信されます。
アクションの後に実行するアニメーションがあるとします。このアニメーションを処理する必要があるのは、モデル、ビュー、またはコントローラーの誰ですか?また、アニメーションロジックはモデル、ビュー、またはコントローラーの一部ですか?
アニメーションは、完全にUIベースの操作のように聞こえます。ビュー内にあります。UIアニメーション以外にも起こっていることはありますか?アニメーションはバックエンドで何かを変更しますか?たとえば、Webアプリケーションがあり、ページが読み込まれたときに、一部のデータ(アニメーション)をフェードインしたい場合...それは完全にビューにあります。データは他のデータと同じようにビューに配信され、アニメーションは完全にUI(ビュー)内で行われます。モデルまたはコントローラーの観点からは何もしません。
ポーカーゲームを考えてみましょう。ユーザーがアクション(たとえば、「レイズ」)を選択した後、システムはアニメーションを再生する必要があります(たとえば、チップがプレーヤーのスポットからデスクに移動します)。このポーカーの例(アニメーション付き)をMVCとしてどのように見ることができますか?それについて説明し、擬似コードを与えることができますか?
アクション(「レイズ」)はコントローラーイベントです。UIはコントローラーに接続して、「レイズ」を実行します。したがって、コントローラーには次のようなメソッドがあります。
View Raise(GameState state)
{
// Interact with the Models to update the known state of the game.
// The Models would perform the actual Poker game logic.
// Respond with a View bound to updated Models.
}
コントローラが新しいビューでUIに応答すると、そのビューにはユーザーに表示するアニメーションが含まれます。(結局のところ、アクションが成功しない限り、アニメーションを実行したくないでしょう?コントローラーが成功したアクションを示す新しいビューでUIに応答すると、アニメーションが再生されます。代わりに、UIに応答する場合があります。ビューがエラーを示している場合、そのビューには別の何かが表示されます。)