MVCを介したMVPの改善点は何ですか?


49

Model-View-Controller(MVC)およびModel-View-Presenter(MVP)パターンについて3日間読んでいます。そして、私を非常に悩ませる1つの質問があります。既にMVCがあったのに、ソフトウェアデザイナーがMVPを発明したのはなぜですか?

MVCが解決しなかった(またはひどく解決した)が、MVPが解決できる問題は何ですか?MVPが解決するのはどの問題ですか?

MVPの歴史と説明、またはMVCとMVPの違いに関する記事をたくさん読んでいますが、私の質問に対する明確な答えがありませんでした。

私が読んだ記事の1つで、次のように言われました。

次に、Model View Presenterを使用します。これは、最新のコンポーネントベースのグラフィカルユーザーインターフェイスに適用した場合のMVCパターンの不備に対する応答でした。最新のGUIシステムでは、GUIコンポーネント自体が、中央のコントローラーではなく、マウスの動きやクリックなどのユーザー入力を処理します。

だから、理解できませんが、実際には別の方法で、GUIコンポーネントがユーザー入力を自分で処理しないようにすることはできますか?そして、「自分で処理する」とはどういう意味ですか?



4
Mickeysoftの新しい流行語である「皇帝の新しい服」だと思います。
qwerty_so 16

4
ビクター、「なぜ2つの異なるパターンがあるのか​​」以外に具体的な質問がありますか?同じ問題を2つの異なる方法で解決するため、2つの異なるパターンがあります。それが役立つ場合、モデルとビューは両方のパターンで本質的に同じです。コントローラーとプレゼンターの違いに注目してください。詳細については、linkinin.com
Robert Harvey

18
「MVCとMVPのパターンについて3日間読んだことがあります。」うわぁ。リラックスできる温かいお風呂に入るか、アヒルがいっぱいの池などで石をスキップすることをお勧めします。そのような読み方は、実用的なアプリケーションがない場合、本当にあなたの脳を溶かすことができます!
user1172763 16

11
必要な答えを得るには、これらのパターンを使用して何か構築します。その後、あなたは啓発されます。
ロバートハーヴェイ

回答:


63

MVCは概念的にエレガントです。

  • ユーザー入力はコントローラーによって処理されます
  • コントローラーがモデルを更新します
  • モデルはビュー/ユーザーインターフェイスを更新します
           +---+
      +----| V |<----+
user  |    +---+     | updates
input |              |
      v              |
    +---+          +---+
    | C |--------->| M |
    +---+ updates  +---+

ただし、MVCのデータフローとイベントフローは循環的です。また、ビューには多くの場合、重要なロジック(ユーザーアクションのイベントハンドラーなど)が含まれます。これらの特性により、システムのテストと保守が困難になります。

MVPアーキテクチャは、ビューとモデルを仲介するプレゼンターにコントローラーを置き換えます。これにより、システムが線形化されます。

       user input         updates
+---+ -----------> +---+ --------> +---+
| V |              | P |           | M |
+---+ <----------- +---+ <-------- +---+
        updates            updates

これには次の利点があります。

  • ロジック(イベントハンドラーやユーザーインターフェイスの状態など)は、ビューからプレゼンターに移動できます。

  • ユーザーインターフェイスの状態が記述されているため、プレゼンターの観点からユーザーインターフェイスを単体テストできます。単体テスト内で、ビューをプレゼンターを呼び出すテストドライバーに置き換えます。

  • ユーザーインターフェイスはアプリケーションロジックから分離されているため、両方を独立して開発できます。

しかし、このアプローチにはいくつかの欠点もあります。

  • もっと努力が必要です。
  • プレゼンターは、維持不可能な「神のクラス」に簡単に変換できます。
  • アプリケーションには単一のMVP軸ではなく、複数の軸があります。ユーザーインターフェイスの各画面/ウィンドウ/パネルに1つです。これにより、アーキテクチャが簡素化されるか、恐ろしく複雑になりすぎます。

7
良い答えですが、現代のMVCは、おそらくローカルフォームの検証を除いて、一般にイベントハンドラーを(もしあれば)あまり使用しません。これらのイベントはMVCの一部であるとは考えていません。 だからこそ、 MVPとMVVMがあります。MVCは基本的にサーバー側です。
ロバートハーベイ

@amon、あなたの答えをありがとう、それは私に多くのことを言います。また、アプリケーションに複数の軸を持たせることで、アーキテクチャを簡素化できます。MVCは複雑なGUIの要件と一致しないため、MVPを発明する主な理由の1つとして、多くの論文でその考えに出会いました。つまり、MVPのどの要件が一致し、その要件をどのように解決するのでしょうか?しつこくしてすみませんが、本当によく理解したいです。
ビクター

4
@Victor最良のパターンはありませんが、トレードオフは異なります。MVCは、複雑な要件に対応できます。アーキテクチャに関して、MVPはビューとプレゼンターの間に1:1の関係を強制します。各ビューには独自のプレゼンターがあり、各プレゼンターは1つのビューに接続されています。MVCには、n:mの関係があります。1つのビューは複数の異なるコントローラーにユーザー入力を送信でき、1つのコントローラーは多くのビューから入力を受信できます。それはより柔軟性がありますが、より混oticとしており、MVCには明確な「軸」はありません。
アモン

1
@Victor GUIの経験はあまりないので、おそらく言及しなかったことがたくさんあります。私が最後に行ったGUIは、その時点でMVPを知らなかったため、絶対に混乱しました。線形化されたデータと制御フローは、大幅に改善されたはずです。
アモン

9
@RobertHarvey私は、ウェブが「MVC」と呼ぶものは、元の定義では決して「MVC」ではなかったと主張します。頭字語をハイジャックした人は誰でも頭をひっくり返して、ロードされた用語を選択し、全員を混乱させるべきです。
jpmc26 16

6

MVPでは、プレゼンターがMVCのコントローラーを置き換えます。2つの違いは、プレゼンターがビューを直接操作することです。これは、主にイベント駆動型(Windowsフォームなど)のUIフレームワーク用に設計されており、MVVMパターン(WPFなど)に役立つリッチデータバインディングを強力にサポートしていません。そうでなければ、ビューステートを管理し、バッキングモデルを更新するための多くのロジックがビュー自体にあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.