私はMVCパターンを学ぼうとしていますが、それぞれの場所で異なることが言えます。だから今私は本当のMVCが何であるかわかりません。
だから私はその最も純粋なMVCを推測しています:
実装
疑似コード:
/* Model */
class Color{
color = blue;
setColor(color);
notifyUpdate();
}
/* View */
class ColorPicker(model){
model.register(update);
update(){
this.colorToExhibit = model.color;
}
}
/* Controller */
class Colorize(view, model){
view.register(update);
update(color){
model.setColor(color);
}
}
いくつかの質問:
ありがとうございました。
- モデルは単なるデータであり、データの変更を通知します。
- ビューはモデルのメッセージを読み取り、ビューを更新します。
- コントローラーはビューからユーザー入力を読み取り、それに応じてモデルを変更します。
モデルは単なるデータではありません。モデルはビジネスロジックでもあります。システムのすべてのインテリジェンス、または少なくとも舞台裏のインテリジェンス(データベース呼び出しやその他のサービス呼び出しなど)の抽象化が含まれています。 「モデルは重く、コントローラは軽量に保つ」という言い回しを考慮してください。
- モデルは誰も知りません。
- ビューはモデルを知っています。
- コントローラはビューとモデルの両方を認識しています。
モデルは誰も知りません。モデルはアプリケーション間で移植可能である必要があり、UIの問題に一切依存しないようにする必要があります。 (この場合、ビューとコントローラーはUIの問題です。)
ビューはモデルを知っています。これも正しいです。ビューは基本的にモデルに「バインド」します。すべてのUI要素が表示され、それに応じてモデルデータがUI要素内に配置されます。
コントローラー種類 "ビューを認識しています。"制御を指示するビューを認識していますが、何も認識していませんaboutそのビューです。また、以前にどのコントロールからどのビューが表示されたかもわかりません。コントローラはイベントに応答します。イベントはUIから受信され、何らかの状態情報(おそらくViewModel)を伝達し、モデル(ビジネスロジックが発生する場所)を介して論理制御を指示し、モデル(または形状が特定のビューに固有のデータの一部は、モデルおよびビューとは異なります。
ビューがモデルを直接変更できない理由はわかりませんが、コントローラーを使用する必要があります。
ビューはユーザーインタラクションのコンテキスト内でモデルを操作できますが、それらの変更が何らかの方法で持続することを期待すべきではありません。ビューは「クライアント側」と見なされるべきであり、「サーバー側」は何も知りません。 (たとえWebアプリケーションではなく、ネイティブアプリケーションについて話している場合でも)変更を永続化することは、UIの「アクション」または「イベント」と見なされ、コントローラーに移動してそれを実現します。
アクションの後に実行するアニメーションがあるとします。誰がこのアニメーションを処理する必要がありますか:モデル、ビュー、またはコントローラー?また、アニメーションロジックはモデル、ビュー、またはコントローラーの一部ですか?
アニメーションは、完全にUIベースの操作のように聞こえます。ビュー内にあります。単なるUIアニメーション以上の出来事はありますか?アニメーション変更バックエンドに何かありますか?たとえば、Webアプリケーションがあり、ページが読み込まれたときに、一部のデータ(アニメーション)をフェードインしたい場合、それは完全にビューにあります。データは他のデータと同様にビューに配信され、アニメーションは完全にUI(ビュー)内で行われます。モデルやコントローラーの観点からはdoは何もしません。
ポーカーゲームを想定します。ユーザーがアクション(たとえば、「レイズ」)を選択した後、システムはアニメーションを再生する必要があります(たとえば、チップはプレーヤーのスポットからデスクに移動します)。このポーカーの例(アニメーション付き)をMVCとして表示するにはどうすればよいですか?それについて説明し、疑似コードを与えることはできますか?
アクション( "Raise")はコントローラーイベントです。 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に応答する場合があります。エラーを示すビューがあり、その場合、そのビューは他の何かを表示します。)
単純なBankのアナロジーを使用します。
銀行家は賢い人であり、ビジネスロジックのすべてを知っており、複雑な計算のすべてを実行します。
ランナーは、お金(データ)をバンカーからテラーに転送するために使用されます。
窓口係は顧客にお金を提示します。
簡単な表現:
モデル
public class BankAccount
{
public int ID;
public int Balance;
public BankAccount(int id)
{
ID = id;
Balance = DetermineAmount();
}
public int DetermineAmount()
{
// Gather transaction info, debits, credits and return a
// sum of the amount left in the account depending on the
// id provided.
}
}
コントローラ
public class BankAccountController
{
public ViewResult Index(int id)
{
BankAccount account = new BankAccount(id);
return View(account);
}
}
ビュー
<ul id="account-info">
<li>Account ID: `@Model.ID`</li>
<li>Balance: `@Model.Balance`</li>
</ul>
歴史的なtrueMVCに興味がある場合は、 Trygve Reenskaug から始めます。彼は1970年代後半にそれを作成(観測?、カタログ化??)しました。まず、1979年の "Models-Views-Controllers" をお読みください。用語を定義しています。タイトルに注意してください-3つの役割はすべて複数形になっています。これは、ほとんどの人が間違っているように見える最初のことです。
MVCの最初の使用法について私が見つけた最良の説明は、実際には2004年付けの "Inside Smalltalk MVC" というタイトルのプレゼンテーションにあります。 Smalltalk 80の最終バージョンのMVCを説明する標準的な論文は、Krasner&Popeの "Smalltalk-80でモデルビューコントローラーのユーザーインターフェイスパラダイムを使用するためのクックブックであると思います" とSteve Burbeckの " Smalltalk-80でのアプリケーションプログラミング:Model-View-Controller(MVC)の使用方法 " =。どちらの論文も読む価値があります。
あなたが殺す時間があり、ロバート・マーティンを聴いても構わないなら、彼は良いことをしました Ruby Midwest 2011 の基調講演)MVCに触れました。 1時間強ですが、かなり面白くて啓蒙的です。ほとんどの実装ではMVCが間違っているという彼の意見に従う傾向があります。少し時間をかけて周りを見て、最終的に、MVCを説明するためにリンクできる図を見つけました。 PopeとKrasnerから来たようなものです。
(ソース: as3dp.com )
私の見解では、以下が重要なポイントです。
実際には、MVCはWebの世界に合わせて変更され、書き直されています。それはもはや実際にはMVCではないか、MVCが単に再定義されただけかもしれません。これが、MVCの非常に多くのさまざまな意見や表現が見られる理由です。デスクトップスタイルのアプリケーションの作成を検討している場合は、Krasner&Popeの記事をご覧ください。 MVCがWebにどのように適用されるかを検討している場合は、Uncle Bobの基調講演でWebアプリケーションにより適した代替案を推奨します-彼がInteractor、Entity、Boundary Architectureより良い名前がないため。 "The Lost Years of Architecture"に関する彼の講演に関連するものを探してください。