MVPVM パターン

最近俄かに出てきたのが、この MVPVM というパターン。MVVM をより発展させたパターンらしいです。図にするとざっとこんな感じらしい。


現状日本語で詳しく解説してるのは、MSDN マガジンの記事だけ。もっとも原文は英語なので、若干翻訳が怪しいとこあるけど。

WPF 向けのモデル - ビュー - プレゼンター - ビューモデル設計パターン


某所のやりとり*1を見ると、ある御仁が MVPVM のプレゼンターについて 「Presenter = コードビハインド」 なんて解釈してるけどそうじゃないよね。上記ドキュメント内のビューの項では

MVPVM では、分離コードにコードを記述する必要はまったくありません

とはっきり述べてます。


また面白いなと思ったのがビューモデルについて。ドキュメントではこんなこと言ってます。

MVPVM: ビューモデル
「MVP では、モデルは純粋なドメイン オブジェクトで、ユーザー インターフェイスに関する想定 (リンク) はありません。」(「3 要素の仕掛け」より)

この定義のため、ビューモデルは 1 つのビューに密結合されず、多数のビューから再利用できます。同様に、ビューモデルはアプリケーション ビジネス ロジックを含まないため、複数のエンタープライズ アプリケーションからビューモデルを簡単に共有できます。そのため、再利用とアプリケーションの統合が進みます。たとえば、図 8 の右下の 28 行目をご覧ください。この SecurityCommandViewModel は、Gwn.Library.MvpVm.xxxx プロジェクト (xxxx は Silverlight、Desktop、または Phone) に含まれています。"ユーザー" ビューモデルはほとんどのアプリケーションで必要になるので、このビューモデルは再利用可能なコンポーネントです。デモ アプリケーション固有のビジネス ロジックをこのビューモデルに含めないよう、注意する必要があります。この作業は、MVPVM では難しくはありません。なぜなら、ビューモデル内ではなく、プレゼンターでビジネス ロジックを処理するためです。

(注: ビューモデルのプロパティをプレゼンターから設定すると、NotifyPropertyChanged イベントが発生し、新しいデータが存在することがビューに通知されます。通知後にビューモデルのデータに合わせてビューを更新するのは、ビュー自体の役割です。)


WPF 向けのモデル - ビュー - プレゼンター - ビューモデル設計パターン


なるほどね・・・ビューモデルをビューと 1 対 1 の関係にせず、複数のビューから利用可能なように共通ライブラリに置いておくと言ってます。これもプレゼンターに処理を委譲しないとできない話ですよね。

この辺りのことについては、明日の RIA 研究会えムナウさんが色々語ってくださると思いますので、ぜひじっくり聴いてみたいと思います。

*1:ぶっちゃけ某巨大掲示板ですがw