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コンポーネントがユーザー入力を単独で処理しないようにすることはできますか?そして、「自分で処理する」とはどういう意味ですか?
MVCは概念的にエレガントです。
+---+
+----| V |<----+
user | +---+ | updates
input | |
v |
+---+ +---+
| C |--------->| M |
+---+ updates +---+
ただし、MVCのデータフローとイベントフローは循環的です。また、ビューには多くの場合、重要なロジック(ユーザーアクションのイベントハンドラーなど)が含まれます。これらの特性により、システムのテストが困難になり、保守が難しくなります。
MVPアーキテクチャは、コントローラーをプレゼンターに置き換えます。プレゼンターは、ビューとモデルの間を仲介します。これはシステムを線形化します:
user input updates
+---+ -----------> +---+ --------> +---+
| V | | P | | M |
+---+ <----------- +---+ <-------- +---+
updates updates
これには次の利点があります。
ロジック(イベントハンドラーやユーザーインターフェイスの状態など)をビューからプレゼンターに移動できます。
ユーザーインターフェイスは、ユーザーインターフェイスの状態を記述するため、プレゼンターの観点から単体テストを行うことができます。ユニットテスト内では、ビューをプレゼンターを呼び出すテストドライバーに置き換えます。
ユーザーインターフェイスはアプリケーションロジックから分離されているため、両方を独立して開発できます。
ただし、このアプローチにはいくつかの欠点もあります。
MVPでは、MVCのコントローラーがプレゼンターに置き換わります。 2つの違いは、プレゼンターが直接ビューを操作することです。これは、主にイベント駆動型(Windowsフォームなど)であり、MVVMパターン(WPFなど)に適した豊富なデータバインディングを大幅にサポートしないUIフレームワーク用に設計されています。それ以外の場合、ビューステートを管理し、バッキングモデルを更新するためのロジックの多くは、ビュー自体にあります。