MVP と MVC とは何ですか? 違いは何ですか? 質問する

MVP と MVC とは何ですか? 違いは何ですか? 質問する

向こう側を見るとラド多くのツールが推奨するユーザーインターフェースの構築方法(ドラッグアンドドロップと設定)では、3つのデザインパターンと呼ばれるものに遭遇する可能性があります。モデル-ビュー-コントローラモデル ビュー プレゼンターそしてモデル-ビュー-ビューモデル私の質問は3つの部分から成ります。

  1. これらのパターンはどのような問題に対処しますか?
  2. それらはどのように似ているのでしょうか?
  3. それらはどう違いますか?

ベストアンサー1

モデル ビュー プレゼンター

MVPでは、プレゼンターにはビューの UI ビジネス ロジックが含まれています。ビューからのすべての呼び出しは、プレゼンターに直接委任されます。プレゼンターはビューから直接分離され、インターフェイスを介してビューと通信します。これにより、単体テストでビューのモックが可能になります。MVP の一般的な属性の 1 つは、双方向のディスパッチが多数必要になることです。たとえば、誰かが [保存] ボタンをクリックすると、イベント ハンドラーはプレゼンターの [OnSave] メソッドに委任します。保存が完了すると、プレゼンターはインターフェイスを介してビューをコールバックし、ビューは保存が完了したことを表示できます。

MVPは、Webフォームで分離されたプレゼンテーションを実現するための非常に自然なパターンです。その理由は、ビューが常にASP.NETランタイムによって最初に作成されるためです。両方の変種についてさらに詳しく知る

2つの主なバリエーション

パッシブ ビュー:ビューは可能な限り単純で、ロジックはほとんど含まれていません。プレゼンターは、ビューとモデルと通信する仲介者です。ビューとモデルは完全に相互に保護されています。モデルはイベントを発生させる場合がありますが、プレゼンターはビューを更新するためにイベントをサブスクライブします。パッシブ ビューでは、直接のデータ バインディングはなく、代わりに、プレゼンターがデータの設定に使用するセッター プロパティがビューで公開されます。すべての状態は、ビューではなくプレゼンターで管理されます。

  • 利点: テスト可能性が最大限に高まり、ビューとモデルが明確に分離される
  • 欠点: すべてのデータ バインディングを自分で行うため、作業量が増えます (たとえば、すべての setter プロパティ)。

監視コントローラー:プレゼンターはユーザーのジェスチャを処理します。ビューはデータ バインディングを通じてモデルに直接バインドします。この場合、モデルをビューに渡してバインドできるようにするのはプレゼンターの役割です。プレゼンターには、ボタンの押下やナビゲーションなどのジェスチャのロジックも含まれます。

  • 利点: データ バインディングを活用することで、コードの量が削減されます。
  • 欠点: テスト可能なサーフェスが少なくなります (データ バインディングのため)。また、モデルと直接通信するため、ビューのカプセル化が少なくなります。

モデル-ビュー-コントローラ

MVCでは、コントローラーは、アプリケーションのロード時など、あらゆるアクションに応じてどのビューを表示するかを決定する役割を担います。これは、アクションがビューを経由してプレゼンターにルーティングされる MVP とは異なります。MVC では、ビュー内のすべてのアクションは、アクションとともにコントローラーへの呼び出しと相関しています。Web では、各アクションには URL への呼び出しが含まれ、その反対側には応答するコントローラーがあります。そのコントローラーが処理を完了すると、正しいビューを返します。シーケンスは、アプリケーションの存続期間中、このように続きます。

    ビュー内のアクション
        -> コントローラーへの呼び出し
        -> コントローラーロジック
        -> コントローラーはビューを返します。

MVC に関するもう 1 つの大きな違いは、View が Model に直接バインドされないことです。View は単にレンダリングするだけで、完全にステートレスです。MVC の実装では、View のコード ビハインドには通常ロジックはありません。これは、View が Presenter に委任しないと呼び出されないため、MVP ではロジックが絶対に必要となるのとは対照的です。

プレゼンテーションモデル

注目すべきもう 1 つのパターンは、プレゼンテーション モデルパターンです。このパターンにはプレゼンターはありません。代わりに、ビューはプレゼンテーション モデルに直接バインドします。プレゼンテーション モデルは、ビュー専用に作成されたモデルです。つまり、このモデルは、ドメイン モデルに配置することは関心の分離に違反するため、決して配置しないプロパティを公開できます。この場合、プレゼンテーション モデルはドメイン モデルにバインドされ、そのモデルからのイベントをサブスクライブできます。次に、ビューはプレゼンテーション モデルからのイベントをサブスクライブし、それに応じて更新します。プレゼンテーション モデルは、ビューがアクションを呼び出すために使用するコマンドを公開できます。このアプローチの利点は、PM がビューのすべての動作を完全にカプセル化するため、基本的にコード ビハインドを完全に削除できることです。このパターンは、WPF アプリケーションで使用するための非常に有力な候補であり、モデル-ビュー-ビューモデル

そこにはプレゼンテーション モデルに関する MSDN の記事そして、WPF の複合アプリケーション ガイダンス(旧プリズム)について分離されたプレゼンテーションパターン

おすすめ記事