メインコンテンツまでスキップ

🧩 MVP(Model-View-Presenter)

✅ このスタイルの概要

Presenter が画面ロジックを担当し、View を極力「受け身」にする UI 構造スタイル。
MVC を発展させ、テスト容易性を高めたものと捉えられる。

✅ 解決しようとした問題

MVC では、実装によっては:

  • View にロジックが入り込みやすい
  • Controller と View の責務が曖昧
  • テストで UI フレームワークに強く依存してしまう

という課題があった。

MVP はこれに対し:

  • View を インターフェース(契約) としてとらえ
  • Presenter に画面ロジックを集中させ
  • Model とのやりとりも Presenter を経由させる

ことで、テストしやすい UI 構造 を実現しようとする。

✅ 基本思想・ルール

● View

  • UI コンポーネント(画面)
  • 入力と表示を担当
  • できるだけロジックを持たない
  • IView のようなインターフェースとして定義されることも多い

● Presenter

  • View と Model の仲介役
  • ユーザー操作の解釈、画面状態の更新を担当
  • View に対して「こう表示して」と指示する

● Model

  • データやドメインロジック

MVP のバリエーション:

  • Passive View(View はほぼ描画のみ)
  • Supervising Controller(View に簡単なバインディングロジックを持たせる)

✅ 得意なアプリケーション

  • テスト容易性が重要なデスクトップアプリケーション(WinForms, WPF の一部など)
  • UI フレームワークへの依存を減らしたい環境
  • 画面ロジックが複雑で、Controller だけでは整理しきれないケース

❌ 不向きなケース

  • UI が非常にシンプルで、MVP 導入コストが見合わない場合
  • 強力なデータバインディング機構(MVVM 的な仕組み)が前提のフレームワーク

✅ 歴史(系譜・親スタイル)

  • MVC の課題に対する発展スタイルとして登場
  • 特に .NET / Java などの GUI アプリケーション界隈で使われた
  • のちに MVVM のようなデータバインディング前提のスタイルにバトンを渡していく

✅ 関連スタイル

  • MVC:元となる UI 構造パターン
  • MVVM:データバインディングを活用したモダン UI パターン
  • MVU:状態と更新を明確に分ける関数型アプローチ

✅ 代表的なフレームワーク

MVP は特定のフレームワーク専用ではなく、主に GUI アプリケーションやテスト容易性を重視するプロジェクトで使われてきた。

  • .NET(WinForms / 初期の WPF アプリ)
    View をインターフェース化し、Presenter から操作する構成が採用されることが多かった。

  • Java GUI(Swing / SWT など)
    UI コンポーネントが重い環境で、Presenter にロジックを寄せてテストを容易にする構成が選ばれることがあった。

  • Android(古いアーキテクチャガイド)
    MVVM が一般的になる前、Activity / Fragment を View とし、Presenter に画面ロジックを集約するパターンがよく使われた。

✅ このスタイルを支えるデザインパターン

MVP では、Presenter が「画面ロジックの中心」となるため、次のパターンが重要になる。

  • Mediator
    Presenter が View と Model の仲介役となり、両者のやりとりを一箇所に集約する。

  • Observer
    Model の変更を Presenter が検知し、View に反映させるパターンとして利用される。

  • State
    画面状態(表示中のモードやバリデーション状態など)を明示的に管理する際に用いられる。

  • Command
    ユーザー操作(ボタンクリックなど)を操作オブジェクトとして扱い、Presenter 内の処理を整理する。

✅ まとめ

MVP は、

  • UI フレームワーク依存を減らし
  • 画面ロジックを Presenter に集約することで
  • テストしやすい UI 構造を提供するスタイルである。

モダンな MVVM / MVU を理解するうえでも、
「View とロジックの分離」を一歩推し進めた中間世代のスタイル として押さえておく価値がある。