5

MVCを実装するにMVC を適切に理解するための私の探求における 3 番目の質問:

私は2つのケースを念頭に置いています:

  1. プライマリ アプリケーション ウィンドウは、設定ウィンドウを起動する必要があります。(あるビューが別のビューを呼び出します。)
  2. アプリケーションのプライマリ モデルは、設定モデルのプロパティにアクセスする必要があります。(あるモデルが別のモデルにアクセスします。)

これらの質問は、どちらも Model-View-Controller トリプレット間の通信に関係しているという点で関連しています。これは、Google であまり議論されていないトピックです。

これを修正する明白な方法は、モデル間のトランザクションを処理し、コントローラーが互いのメソッドを呼び出せるようにする最上位の「アプリケーション」オブジェクトにすべてをラップすることです。私はこれが実装されているのを見てきましたが、それが良い考えだとは確信していません。コントローラーが複数のモデルを監視し、複数のビューに応答する可能性も見られますが、これは非常に雑然として追跡が困難になるようです。

この種のクロストークを実装する最善の方法についての提案はありますか? 非常に明白な質問のように感じますが、十分に文書化された解決策を見つけることができませんでした。

より広い意味で、この種の MVC の問題に対する典型的なアプローチを示すリンクを誰かが持っている場合は、それを見てみたいです。堅実で自明ではない参考文献を見つけるのはあまり運がありませんでした。Python での例は素敵ですが、喜んで何でも読みます。

編集1

以下で非常に興味深いことが述べられていますが、一般的に、私が説明したアプローチに問題がある人は誰もいないようです。Vincent が説明している FrontController 設計は、すでにほとんど怠惰な形になっています。そのパターンを実装する上で問題が発生することは確かにないと思いますが、モデル間の通信に関する問題に実際に対処した人は誰もいないようです。すべての答えは、単一のモデル内のオブジェクト間の通信に対処しているようです。私は、アプリケーションの個別のコンポーネントに対して個別のモデルを維持することに関心があるので、50 の状態プロパティを 1 つのモデル クラスに詰め込みません。代わりにサブモデルとして維持する必要がありますか?

4

3 に答える 3

4

(1)に関しては、ビューは他のビューを呼び出しません。それらは、他のビューがレンダリングされる可能性があるコントローラー アクションを呼び出します。あなたの場合、プライマリ アプリケーション ウィンドウには、コントローラー アクションを呼び出して設定ウィンドウを表示するユーザー インターフェイス要素 (ボタン、リンク) が含まれています。

(3) に関しては、モデル コンポーネントは確かに相互に関連している可能性があります。これは予期せぬことでも、回避すべきことでもありません。たとえば、Customer モデルには一連の Order が関連付けられている場合があります。Customer クラスのメソッドを介して顧客の注文にアクセスするのはまったく自然なことです。

概要については、ウィキペディアのMVC ページを参照してください。

于 2008-10-22T23:58:01.740 に答える
2

フロント コントローラーのデザイン パターンを調べることを検討してください。

フロント コントローラー パターンは、アプリケーション リクエストの処理を担当する単一のコンポーネントを定義します。フロント コントローラーは、ビューの選択、セキュリティ、テンプレート作成などの機能を一元化し、すべてのページまたはビューに一貫して適用します。したがって、これらの関数の動作を変更する必要がある場合、変更する必要があるのはアプリケーションのごく一部 (コントローラーとそのヘルパー クラス) だけです。

このようにして、ビューからのすべてのリクエストは FrontController に送られ、FrontController はどの特定のアクション (コントローラー) を呼び出すかを決定します。最初のケースのように、別のビューに直接進むこともあります。

モデル内の複数のオブジェクトが互いに通信しても問題はありません。実際、それは非常に一般的です。私の見方では、モデル内のすべてのオブジェクトは、データとデータに対する操作を表す 1 つのコンポーネントのように機能します。

この記事が役立つかもしれません。そしてこれ

于 2008-10-22T23:53:59.097 に答える
0

モデルとは、単一のモデル オブジェクトを意味するものではありません。モデルは、問題のコントローラー アクションとビューに直接関連するドメイン モデル全体のサブセットです。

于 2008-10-23T00:05:55.143 に答える