8

私は主に Web 開発者ですが、C++ と C# についてはよく理解しています。しかし、最近、GUI アプリケーションを作成していて、コントローラーとビュー ロジックの関係を処理する方法に迷い始めました。PHP では非常に簡単で、目を閉じたまま独自の MVC パターンを作成できました。主な理由は、PHP がステートレスであり、リクエストごとにフォーム全体を再生成するためです。しかし、アプリケーション プログラミング言語では、すぐに道に迷います。

私の質問は、コントローラーをビューから分離するにはどうすればよいですか? ビューはコントローラーからのイベントにアタッチする必要がありますか? または、ビューはコントローラーが対話するインターフェイスを実装する必要がありますか?

4

5 に答える 5

6

私があなただったら、あなたのビューのインターフェースからイベントを公開します。これにより、コントローラーをインタラクション全体の中心にすることができます。

コントローラーが最初にロードされ、ビューがインスタンス化されます。私は依存性注入を使用して、ビュー自体ではなくインターフェースのみに依存性を作成するようにします。コントローラーはモデルにアクセスし、データをビューにロードします。コントローラーは、ビュー インターフェイスで定義されたイベントにバインドします。コントローラーは、イベントを介してモデルへのデータの保存を処理します。

必要に応じて、ビューごとにインターフェイスを宣言する必要がなくなるイベント ブローカーを使用することもできます。このようにして、属性を介してイベントにバインドできます。

これにより、コントローラーはモデルとビュー インターフェイスに依存し、ビューはデータのみに依存し、モデルは依存関係を持たないままになります。

上記の設計思想のいくつかの例は、CAB および Smart Client Software Factory Link To Smart Clientで見つけることができます。彼らは MVP パターンを使用していますが、MVC パターンにも同じように簡単に適用できます。

于 2008-10-07T07:31:05.047 に答える
3

ほとんどすべての GUI フレームワーク (MFC から SWT まで) は、既に MVC ベースです。実際、MVC パターンは Smalltalk-80 によって最初に作成され、その後 GUI 開発に実際に使用されました。

選択した GUI ツールキットの標準と推奨プラクティスを再確認してください。特定の問題を解決したり、特定のツールキットを操作したりする場合、MVC が適切なパターンではない場合があります。

覚えておいてください: MVC は優れたパターンですが、万能のソリューションではありません。イベントベースまたは関数型スタイルのプログラミングがあなたの生活を楽にする場合、MVC に問題を押し付けようとしないでください。

于 2008-10-10T04:10:41.483 に答える
1

覚えておくべき重要なことは、MVC セットアップでは、コントローラーは呼び出すビューを認識している必要がありますが、ビューはコントローラーについて何も認識してはならないということです。

したがって、View は Controller がそれと対話するための一般化された方法を提供する必要があります。これにより、いくつかの異なる Controller が同じ View を呼び出せるようになります (たとえば、パラメーターとして提供されるいくつかのデータの標準化されたグラフィカル出力)。

これにより、柔軟性が得られます。

  1. 顧客が HTML 出力のみを提供するものの PDF 出力を希望する場合は、HTML ビューと同じパラメーターを使用してコントローラーから呼び出される新しい PDF ビューを作成することで解決できます。
  2. 顧客が別のデータ ソースの同様の HTML 出力を必要とする場合 (たとえば)、同じ古い HTML ビューに別のデータ セットを提供する新しいコントローラーをコーディングすることで解決できます。これにより、同じ HTML レポートに他のデータのみが表示されます。

View を特定の Controller から切り離したままにし、Controller からどの View を呼び出すかについての知識を入れておけば、順調に進んでいます。

于 2008-10-07T08:24:53.110 に答える
1

次の GUI を想像してください。

Zergling ユニットは、エイリアン アイコンとしてユーザーに表示されます。アイドル アニメーションになっていることがわかります。これをビューと呼びます。

プレーヤーは、ユニットとターゲットの場所をクリックしてユニットを移動します。必要に応じて、プレーヤーを AI に置き換えることができます。これをコントローラーと呼びます。

ユニットの HP と攻撃範囲は、ユニットが戦闘中のゲーム フレームごとに計算されます。このデータを変更して、Zergling をレンジ ユニットにすることができます。これをモデルと呼びます。

この類推を念頭に置いて、MVC 設計に拡張してください。

于 2008-10-07T07:14:59.460 に答える
0

コントローラーは、ビューが実装するインターフェイスで定義されたイベントに確実にバインドする必要があります。

これをどのように行うかは、難しい部分になる可能性があります。依存性注入?ビューファクトリー?ビューに必要なコントローラーをインスタンス化させますか? それは、アプリケーションがどれほど複雑になるかによって大きく異なります。

非常に迅速かつ単純なものとして、各ビューをコントローラーとして構築することから始め、それを大きくする必要がある場合は他のオプションを検討します。個人的には、完全な依存性注入フレームワークは、半ダースのフォームにはやり過ぎだと思います:]

于 2008-10-07T08:37:22.913 に答える