17

MVPパターンを使用しようとしていますが、設計上の問題が発生しています。私はいくつかのUserControlsを持つアプリケーションを開発しています。UserControl自体は互いに関係がなく、実際のモデルのサブセットのみを表します。私が読んだことから、人々はあなたがビューごとに1つのプレゼンターを使うべきだと言う傾向があります。これは理にかなっているようですが、30個のUserControlがある場合、本当に30個のプレゼンターが必要ですか?反対に、「アプリケーション」ビュー全体を表す1つのプレゼンターと1つのビューがある場合、ビューとプレゼンターのインターフェイスが肥大化します。次に、各ビューは、それとは関係のないメソッドを実装する必要があります。私の質問は、複数のUserControlを処理するためのより良い方法はありますか、それともビューごとに1つのプレゼンターを作成する必要がありますか?

4

4 に答える 4

18

次の理由により、1つのコントロールごとに1つのプレゼンターを実行する必要があります。

  • これにより、そのコントロールのみに取り組む集中ユニットテストを行うことができます
  • すべてのコントロールのプレゼンテーションロジックの結合を含む巨大なプレゼンターをサポートする必要がないため、保守性が向上します
  • これにより、複数のページで同じ制御を行う場合の冗長性が妨げられます
  • ページがコンテナ固有の役割を実行している間、特定のロジックに焦点を合わせたコントロールを持つことにより、SRPを向上させます。

「コントロールごとのプレゼンター」の決定に関連して通常言及される2つの問題があります。

  • 共有コンテキストは問題です。すべてのコントロールが同じページデータコンテキストの異なる部分を表示しているため、その状況は問題のあるユースケースのように見え、すべてのコントロールで大量のデータ取得の冗長コードが発生する可能性があります。これは、ページ(またはコントローラー)が単一のデータ取得を実行し、データコンテキストオブジェクトをすべてのプレゼンター/ビューに注入する依存性注入によって簡単に解決できます(通常、それを可能にするインターフェイスを実装します)。MV-VMパターン(Silverlight、WPF)の場合、ページがデータコンテキストを設定し、ビュー自体から使用されるデータ境界を介して同じ効果を実現できます。
  • 同じページのビュー間の通信は、いくつかのアプローチを使用して簡単に解決できる2番目の問題です。
  • コントロールは、ページがサブスクライブするイベントを公開し、他のコントロールの適切なメソッドを直接呼び出します(ページはすべてのコントロールのコンテナーであり、すべてのメンバーを認識していることを意味します)
  • オブザーバーデザインパターン
  • イベントアグリゲーターパターン

このアプローチのそれぞれにおいて、コントロールは互いに気づかずに互いに通信しています。

于 2009-04-26T07:10:35.160 に答える
14

関連するコードを 1 つのオブジェクトにグループ化する方が理にかなっています。したがって、この場合、ビューが関連するコードの特定のグループ化である場合、プレゼンターもこれらのグループ化を模倣します。異なるビューの「グローバル」プレゼンターを使用すると、無関係なコードが 1 つのオブジェクトにグループ化されます。プレゼンターのインターフェイスも間違いなく肥大化します。単一責任の原則を確認してください。

これで、インターフェイス分離原則の状態のように、いずれかの継承によって各プレゼンター インターフェイスにアクセスできる 1 つのプレゼンター マネージャー クラスを持つことができます(多くのプレゼンター インターフェイスを実装するグローバルな具体的なプレゼンターを使用します。これは単一の責任に違反します)。 )または集約(各インターフェースと取得機能に個別のプレゼンターを用意する...したがって、グローバルインターフェースは取得機能になります)または両方の組み合わせ(グローバルプレゼンターはアダプターのようなものです)。

最善の解決策は、30 人の異なるプレゼンターを用意することだと思います。

于 2009-04-24T18:01:20.540 に答える
0

各ビューは同じインターフェイスを実装する必要はありません...各コントロールのインターフェイスを定義し、すべてのコントロールを含む画面全体に 1 つのプレゼンターを用意しないのはなぜですか? プレゼンターは、各ビューが必要とするインターフェイス定義のイベントに従って、各ビューのイベントを、プレゼンター (および MVPC を実行している場合はコントローラー) の適切なイベント ハンドラーに "関連付ける" ことができます。すべてのビューが共通にアクセスする必要があるプレゼンター機能を表すために、別のインターフェイスが必要になる場合もあります...

  • MVPC を実行している場合、モデルに影響するビュー イベントはコントローラーで「処理」されますが、ビューの他の部分にのみ影響するビュー イベントはプレゼンターで処理されます。
于 2009-04-24T16:22:15.863 に答える
0

古い質問ですが、パイプを上げて他の回答に同意しなければなりません: UserControl ごとに 1 つのプレゼンターは必要ありません。すべての UserControl で単体テストが必要なのと同じです。デザインパターン。

UserControl はビューではありません。

アプリケーションの各論理領域には 1 つのプレゼンターが必要です。それぞれがどのように分割されるか (コントロールの数、何が何を示すか) は、もっぱら構成の問題です。

于 2014-04-18T12:48:52.853 に答える