SlideShare a Scribd company logo
MVPVMパターン

えムナウ (児玉宏之)
http://mnow.jp/
http://mnow.wankuma.com/
http://blogs.wankuma.com/mnow/
http://www.ailight.jp/blog/mnow/
アジェンダ

•   はじめに
•   MVPVM 設計パターン
•   ナビゲーション
•   プレゼンター
•   まとめ
はじめに

• MSDN マガジン2011年12月号で発表され
  た「MVPVM 設計パターン」ですが、私も
  ViewとViewMode​lの両方を知っていて現状
  の画面状態を管理する何者かが​必要なこと
  は感じていました。
• Applicationの派生クラスやApplicat​ionが操
  作するオブジェクトとして現状の画面状態
  を管​理やナビゲーションをする機能をつ
  くっていました。今回のセッションでは私
  なりに研究した「MVPVM 設計パターン」
  をお届けします。
MVPVM 設計パターン

• モデル - ビュー - プレゼンター - ビューモ
  デル (MVPVM: Model-View-Presenter-
  ViewModel) パターンは、 Microsoft
  patterns & practices の Prism プロジェク
  トで導入されました。
• MVVM の能力と機能をすべて利用でき、
  MVPの拡張性からプレゼンテーションロ
  ジックの複雑さにも対応でき、ViewModel
  は本来あるべきプロパティ公開とコマンド
  の受付になります。
MVPVM 設計パターン

• MVPVMパターン
 – それではMVPVMパターンとはなんでしょう
   か?
 – MVVMパターン と MVPパターンを合体させた
   ものです。
 – MVVMパターン と MVPパターンを見てみま
   しょう。
MVPVM 設計パターン

• MVVMパターン
 – View:ユーザーインターフェースの外観や配
   置や反応(インタラクション)を定義する
 – ViewModel:Viewの必要な情報をプロパティ
   で公開しユーザー入力やコマンドを処理する
 – Model:データの取得や管理を行いプログラム
   の処理の中核となる
MVPVM 設計パターン

• MVVMパターン


   View                          Model



                コマンド
データバ
インド


                ViewModel
          プロパ               データ取得・更
          ティ                新
MVPVM 設計パターン

• MVPパターン
 – View:ユーザーインターフェースの外観や配
   置や反応(インタラクション)を定義する
 – Presenter:Viewのナビゲーションを管理し
   ユーザー入力をModelに伝える
 – Model:データの取得や管理を行いプログラム
   の処理の中核となる
MVPVM 設計パターン

• MVPパターン


   View                        Model



              入力




              Presenter
     ナビゲーショ               データ取得・更
     ン                    新
MVPVM 設計パターン

• MVPVMパターン
 – View:ユーザーインターフェースの外観や配
   置や反応(インタラクション)を定義する
 – ViewModel:Viewの必要な情報をプロパティ
   で公開しユーザー入力やコマンドをPresenter
   に渡す
 – Presenter:ViewやのViewModelのナビゲー
   ションを管理しユーザー入力をModelに伝える
 – Model:データの取得や管理を行いプログラム
   の処理の中核となる
MVPVM 設計パターン

• MVPVMパターン

                                Presenter
                   ナビゲーショ
   View            ン                    データ取得・更
                                        新

            コマンド
データバ                           データ更新依頼
インド


                   ViewModel
          プロパ                               Model
          ティ
ナビゲーション

• ナビゲーション
 – MVVMパターンではどこがナビゲーションを
   担当していたのでしょうか?
 – 答えの一つはメッセージ+ビヘイビアーです。
 – ビヘイビアーはViewの分類になります。
 – 「ViewModel から View を操作する」という
   こと葉を聞いたことがある人もいるでしょ
   う。
 – 操作というのはメッセージを送ってメッセー
   ジボックスやダイアログを表示したりするこ
   とも多かったのです。
ナビゲーション
  • メッセージボックス
public class DialogMessageBehavior : Behavior<DependencyObject>
  {
     protected override void OnAttached()
     {
        base.OnAttached();
        Messenger.Default.Register<DialogMessage>(AssociatedObject, p => Invoke(p));
     }
     protected override void OnDetaching()
     {
        base.OnDetaching();
        Messenger.Default.Unregister<DialogMessage>(AssociatedObject);
     }
     private void Invoke(object parameter)
     {
        DialogMessage message = parameter as DialogMessage;
         MessageBoxResult result =
MessageBox.Show(message.Content, message.Caption, message.Button, message.Icon, m
essage.DefaultResult, message.Options);
         message.ProcessCallback(result);
      }
  }
ナビゲーション
  • ダイアログ
public class DialogMessageBehavior : Behavior<Wndow>
  {
     protected override void OnAttached()
     {
        base.OnAttached();
        Messenger.Default.Register<DialogMessage>(AssociatedObject, p => Invoke(p));
     }
     protected override void OnDetaching()
     {
        base.OnDetaching();
        Messenger.Default.Unregister<DialogMessage>(AssociatedObject);
     }
     private void Invoke(object parameter)
     {
        DialogMessage message = parameter as DialogMessage;
         AssociatedObject.DataContext = message.ViewModel;
         bool? result = AssociatedObject.ShowDialog();
         message.ProcessCallback(result);
      }
  }
ナビゲーション

• ナビゲーション
  – MVVMパターンでは他にどこがナビゲーショ
    ンを担当していたのでしょうか?
  – 答えの一つはViewModel+DataTemplateです。
<DataTemplate DataType="{x:Type c:GreekGodViewModel}">
    <TextBlock Text="{Binding Path=Name}" Foreground="Gold"/>
</DataTemplate>


  – さらに DataTemplate をデータによって切り
    替える DataTemplateSelector というのもあり
    ます。
  – DataTemplate はViewの分類になります。
ナビゲーション

 • DataTemplateSelector
public class TaskListDataTemplateSelector : DataTemplateSelector
{
  public override DataTemplate
         SelectTemplate(object item, DependencyObject container)
  {
     FrameworkElement element = container as FrameworkElement;
     if (element != null && item != null && item is TaskViewModel)
     {
         var taskitem = item as TaskViewModel;
         if (taskitem.Priority == 1)
             return element.FindResource("importantTaskTemplate") as DataTemplate;
         else
             return element.FindResource("myTaskTemplate") as DataTemplate;
     }
     return null;
  }
}
ナビゲーション

• MVVMパターンは、View と ViewModel は
  疎結合でお互いに交換可能であるというこ
  とが利点の一つであるといわれていまし
  た。
• どうして今見てきたような密結合が生まれ
  てしまったのでしょうか?
• ナビゲーションは View と ViewModel の両
  方を知らないとできません、この場合
  View に仕込んでますので ViewModel や 本
  来ViewModel にあるべきデータが View に
  出てきてしまいます。
ナビゲーション

• ナビゲーション
 – MVVMパターンではViewだけがナビゲーショ
   ンを担当していたのでしょうか?
 – 答えの一つはアプリケーションクラスです。
 – アプリケーションクラスはMVVMパターンの
   範囲外です。
 – 範囲外であれば別に問題ないのでしょうか?
 – ナビゲーションを担当する Presenter があれ
   ばアプリケーションクラスはすっきりするは
   ずです。
ナビゲーション
• アプリケーションクラス
protected override void OnStartup(StartupEventArgs e)
     {
       var win = new Views.TwitterWindow();
       this.MainWindow = win;
       var account = LoadAccount();
            if (account == null)
           account = NewAccountWithDialog();
       if (account != null)
           SaveAccount(account);
       else
       {
           MessageBox.Show("認証失敗");
           return;
       }
       var vm = new ViewModel.TwitterViewModel(
                    ConsumerKey, ConsumerSecret, account.Token);
       win.DataContext = vm;
       win.Show();
       base.OnStartup(e);
     }
プレゼンター

• プレゼンターの役割
 – View と ViewModel のインスタンス作成を行
   います。
 – View をパネルなどのコンテナに追加し、
   DataContext に ViewModel をセットします。
 – Model に表示すべきデータを要求し
   ViewModel にセットします。
 – 上位の Presenter や ViewModel の依頼により
   更新すべきデータを収集し Model を更新しま
   す。
 – View と ViewModel のインスタンス解放を行
   います。
プレゼンター

• プレゼンターの構成
 – Presenter はパネルなどのコンテナで複数の
   Presenter を管理する Presenter と、ユーザー
   コントロールやダイアログなどの単一ビュー
   を管理するPresenter があります。
 – View や ViewModel が階層構造になっている
   ように Presenter も階層構造になります。
プレゼンター

• プレゼンターの利点
 – Application や ViewModel からプレゼンテー
   ションロジックを解放します。
 – View と ViewModel は疎結合でお互いに交換
   可能な状態に戻すことにより、再利用性を高
   め View や ViewModel をライブラリ化しやす
   くします。
 – View と ViewModel と Model 全てにアクセス
   可能な存在なので、アンドゥ・リドゥの実装
   場所に最適です。
 – ViewModel から View をクローズするメッ
   セージは必要なくなります。
プレゼンター

• 親が子供を管理
 – ダイアログ を表示させたいPresenterは ダイ
   アログを管理するPresenterを生成して、ダイ
   アログが閉じたら解放します。
 – パネルなどのコンテナを管理するPresenterは、
   パネルの中身を管理するPresenterをパネル内
   に表示するときに生成してパネルから削除さ
   れるときに解放します。
プレゼンター

• コンテナ内をスライドして入れ替わる




        A画面      B画面
プレゼンター

• WPFやSilverlightではこんな画面変化も可
  能ですが、この場合はコンテナとなるパネ
  ルにストーリーボードを仕掛けて
  RenderTransform の TranslateTransform
  を変化させて表示を変えます。
• 最初にA画面とB画面の View と
  ViewModel を用意してA画面を表示範囲内
  にB画面を表示範囲外に設定してストー
  リーボードを起動します。
プレゼンター

• MVVMパターンでは、 A画面とB画面の
  View と ViewModel を知っている何かの存
  在が必要でコンテナの View で実行すると
  したら、かなりの密結合になってしまった
  と思います。
プレゼンター

• MVPVMパターンでは、 A画面のPresenter
  はA画面の View と ViewModel を知ってい
  て、 B画面のPresenterはB画面の View と
  ViewModel を知っています、コンテナの
  Presenterはコンテナの View と
  ViewModel の他に、 A画面とB画面の
  Presenterを知っています。
• 役割分担でき疎結合性も保たれます。
まとめ

• MVPVMパターンはMVVM の能力と機能を
  すべて利用でき、 MVPの拡張性からプレ
  ゼンテーションロジックの複雑さにも対応
  できます。
• MVPVMパターンは View と ViewModel は
  疎結合でお互いに交換可能な状態に戻すの
  に有効な手段です。
• 皆さんも検討してみたらどうでしょうか?

More Related Content

What's hot

C++のビルド高速化について
C++のビルド高速化についてC++のビルド高速化について
C++のビルド高速化についてAimingStudy
 
HTML5 & CSS3 : Jeux
HTML5 & CSS3 : Jeux HTML5 & CSS3 : Jeux
HTML5 & CSS3 : Jeux
Ghodhbane Mohamed Amine
 
PHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 とPHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 と
do_aki
 
ASP.NET Core WebAPIでODataを使おう
ASP.NET Core WebAPIでODataを使おうASP.NET Core WebAPIでODataを使おう
ASP.NET Core WebAPIでODataを使おう
DevTakas
 
Pipeline oriented programming
Pipeline oriented programmingPipeline oriented programming
Pipeline oriented programming
Scott Wlaschin
 
高負荷に耐えうるWebApplication Serverの作り方
高負荷に耐えうるWebApplication Serverの作り方高負荷に耐えうるWebApplication Serverの作り方
高負荷に耐えうるWebApplication Serverの作り方
GMO-Z.com Vietnam Lab Center
 
SQLアンチパターン - ジェイウォーク
SQLアンチパターン - ジェイウォークSQLアンチパターン - ジェイウォーク
SQLアンチパターン - ジェイウォーク
ke-m kamekoopa
 
IEC61131-3_Ed3_オブジェクト指向FB.pdf
IEC61131-3_Ed3_オブジェクト指向FB.pdfIEC61131-3_Ed3_オブジェクト指向FB.pdf
IEC61131-3_Ed3_オブジェクト指向FB.pdf
ssuserdc9318
 
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
shinjiigarashi
 
Groovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようGroovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみよう
Akira Shimosako
 
Webデザイン 第10回:HTML5実践 Three.jsで3Dプログラミング
Webデザイン 第10回:HTML5実践 Three.jsで3DプログラミングWebデザイン 第10回:HTML5実践 Three.jsで3Dプログラミング
Webデザイン 第10回:HTML5実践 Three.jsで3DプログラミングAtsushi Tadokoro
 
"Simple Made Easy" Made Easy
"Simple Made Easy" Made Easy"Simple Made Easy" Made Easy
"Simple Made Easy" Made Easy
Kent Ohashi
 
Squirrel
SquirrelSquirrel
Squirrelmelpon
 
静的解析を使った開発ツールの開発
静的解析を使った開発ツールの開発静的解析を使った開発ツールの開発
静的解析を使った開発ツールの開発
Takuya Ueda
 
소프트웨어 아키텍처
소프트웨어 아키텍처소프트웨어 아키텍처
소프트웨어 아키텍처
영기 김
 
Swaggerでのapi開発よもやま話
Swaggerでのapi開発よもやま話Swaggerでのapi開発よもやま話
Swaggerでのapi開発よもやま話
KEISUKE KONISHI
 
La gestion des exceptions avec Java
La gestion des exceptions avec JavaLa gestion des exceptions avec Java
La gestion des exceptions avec Java
Papa Cheikh Cisse
 
Functional Programming Patterns (BuildStuff '14)
Functional Programming Patterns (BuildStuff '14)Functional Programming Patterns (BuildStuff '14)
Functional Programming Patterns (BuildStuff '14)
Scott Wlaschin
 
Ruby での外部コマンドの実行について
Ruby での外部コマンドの実行についてRuby での外部コマンドの実行について
Ruby での外部コマンドの実行について
Tomoya Kawanishi
 
Requêtes HTTP synchrones et asynchrones
Requêtes HTTPsynchrones et asynchronesRequêtes HTTPsynchrones et asynchrones
Requêtes HTTP synchrones et asynchrones
Abdoulaye Dieng
 

What's hot (20)

C++のビルド高速化について
C++のビルド高速化についてC++のビルド高速化について
C++のビルド高速化について
 
HTML5 & CSS3 : Jeux
HTML5 & CSS3 : Jeux HTML5 & CSS3 : Jeux
HTML5 & CSS3 : Jeux
 
PHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 とPHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 と
 
ASP.NET Core WebAPIでODataを使おう
ASP.NET Core WebAPIでODataを使おうASP.NET Core WebAPIでODataを使おう
ASP.NET Core WebAPIでODataを使おう
 
Pipeline oriented programming
Pipeline oriented programmingPipeline oriented programming
Pipeline oriented programming
 
高負荷に耐えうるWebApplication Serverの作り方
高負荷に耐えうるWebApplication Serverの作り方高負荷に耐えうるWebApplication Serverの作り方
高負荷に耐えうるWebApplication Serverの作り方
 
SQLアンチパターン - ジェイウォーク
SQLアンチパターン - ジェイウォークSQLアンチパターン - ジェイウォーク
SQLアンチパターン - ジェイウォーク
 
IEC61131-3_Ed3_オブジェクト指向FB.pdf
IEC61131-3_Ed3_オブジェクト指向FB.pdfIEC61131-3_Ed3_オブジェクト指向FB.pdf
IEC61131-3_Ed3_オブジェクト指向FB.pdf
 
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
 
Groovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようGroovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみよう
 
Webデザイン 第10回:HTML5実践 Three.jsで3Dプログラミング
Webデザイン 第10回:HTML5実践 Three.jsで3DプログラミングWebデザイン 第10回:HTML5実践 Three.jsで3Dプログラミング
Webデザイン 第10回:HTML5実践 Three.jsで3Dプログラミング
 
"Simple Made Easy" Made Easy
"Simple Made Easy" Made Easy"Simple Made Easy" Made Easy
"Simple Made Easy" Made Easy
 
Squirrel
SquirrelSquirrel
Squirrel
 
静的解析を使った開発ツールの開発
静的解析を使った開発ツールの開発静的解析を使った開発ツールの開発
静的解析を使った開発ツールの開発
 
소프트웨어 아키텍처
소프트웨어 아키텍처소프트웨어 아키텍처
소프트웨어 아키텍처
 
Swaggerでのapi開発よもやま話
Swaggerでのapi開発よもやま話Swaggerでのapi開発よもやま話
Swaggerでのapi開発よもやま話
 
La gestion des exceptions avec Java
La gestion des exceptions avec JavaLa gestion des exceptions avec Java
La gestion des exceptions avec Java
 
Functional Programming Patterns (BuildStuff '14)
Functional Programming Patterns (BuildStuff '14)Functional Programming Patterns (BuildStuff '14)
Functional Programming Patterns (BuildStuff '14)
 
Ruby での外部コマンドの実行について
Ruby での外部コマンドの実行についてRuby での外部コマンドの実行について
Ruby での外部コマンドの実行について
 
Requêtes HTTP synchrones et asynchrones
Requêtes HTTPsynchrones et asynchronesRequêtes HTTPsynchrones et asynchrones
Requêtes HTTP synchrones et asynchrones
 

Viewers also liked

オンラインゲームと社内テスト
オンラインゲームと社内テストオンラインゲームと社内テスト
オンラインゲームと社内テスト
Katsumi Mizushima
 
Prism.Formsについて
Prism.FormsについてPrism.Formsについて
Prism.Formsについて
一希 大田
 
ゲーム制作初心者が知るべき8つのこと
ゲーム制作初心者が知るべき8つのことゲーム制作初心者が知るべき8つのこと
ゲーム制作初心者が知るべき8つのこと
MASA_T_O
 
ゲーム技術の研究所 テーマ「Narrative(ナラティブ)」
ゲーム技術の研究所 テーマ「Narrative(ナラティブ)」ゲーム技術の研究所 テーマ「Narrative(ナラティブ)」
ゲーム技術の研究所 テーマ「Narrative(ナラティブ)」
Kouji Ohno
 
エターナらないゲーム開発
エターナらないゲーム開発エターナらないゲーム開発
エターナらないゲーム開発
Kohki Miki
 
ゲームエンジンの中の話
ゲームエンジンの中の話ゲームエンジンの中の話
ゲームエンジンの中の話
Masayoshi Kamai
 
telephone data systems 2002proxy
telephone data systems  2002proxytelephone data systems  2002proxy
telephone data systems 2002proxy
finance48
 
Changed title
Changed titleChanged title
Changed title
Barry Gregory
 
Warandecollege 05102010
Warandecollege 05102010Warandecollege 05102010
Warandecollege 05102010
Johan Lapidaire
 
Presentatie wijsheidsboeken 9v10 prediker Vineyard Utrecht 18122011
Presentatie wijsheidsboeken 9v10 prediker Vineyard Utrecht 18122011Presentatie wijsheidsboeken 9v10 prediker Vineyard Utrecht 18122011
Presentatie wijsheidsboeken 9v10 prediker Vineyard Utrecht 18122011vineyardutrecht
 
molson coors brewing ProxyStatement1
molson coors brewing   ProxyStatement1molson coors brewing   ProxyStatement1
molson coors brewing ProxyStatement1
finance46
 
毕业年,行走无疆界
毕业年,行走无疆界毕业年,行走无疆界
毕业年,行走无疆界
cscguochang
 
hormel foods 2005_Proxy
hormel foods  2005_Proxyhormel foods  2005_Proxy
hormel foods 2005_Proxy
finance46
 
Rx for Ad Agencies Suffering From Direct, Digital and Social Media Confusion...
Rx for Ad Agencies Suffering From Direct,  Digital and Social Media Confusion...Rx for Ad Agencies Suffering From Direct,  Digital and Social Media Confusion...
Rx for Ad Agencies Suffering From Direct, Digital and Social Media Confusion...
Clive Maclean
 
Personality Development Notes
Personality Development NotesPersonality Development Notes
Personality Development Notes
soumya6170
 
Guia de lecturas 2C2010
Guia de lecturas 2C2010Guia de lecturas 2C2010
Guia de lecturas 2C2010
finanzas_uca
 
Pssssssssssssiu
PssssssssssssiuPssssssssssssiu
Pssssssssssssiu
marileuza
 
Sociale Innovatie 06102010
Sociale Innovatie 06102010Sociale Innovatie 06102010
Sociale Innovatie 06102010
Johan Lapidaire
 
Guía de lecturas Finanzas II 20112 s
Guía de lecturas Finanzas II 20112 sGuía de lecturas Finanzas II 20112 s
Guía de lecturas Finanzas II 20112 s
finanzas_uca
 

Viewers also liked (20)

オンラインゲームと社内テスト
オンラインゲームと社内テストオンラインゲームと社内テスト
オンラインゲームと社内テスト
 
Prism.Formsについて
Prism.FormsについてPrism.Formsについて
Prism.Formsについて
 
ゲーム制作初心者が知るべき8つのこと
ゲーム制作初心者が知るべき8つのことゲーム制作初心者が知るべき8つのこと
ゲーム制作初心者が知るべき8つのこと
 
ゲーム技術の研究所 テーマ「Narrative(ナラティブ)」
ゲーム技術の研究所 テーマ「Narrative(ナラティブ)」ゲーム技術の研究所 テーマ「Narrative(ナラティブ)」
ゲーム技術の研究所 テーマ「Narrative(ナラティブ)」
 
エターナらないゲーム開発
エターナらないゲーム開発エターナらないゲーム開発
エターナらないゲーム開発
 
ゲームエンジンの中の話
ゲームエンジンの中の話ゲームエンジンの中の話
ゲームエンジンの中の話
 
telephone data systems 2002proxy
telephone data systems  2002proxytelephone data systems  2002proxy
telephone data systems 2002proxy
 
Changed title
Changed titleChanged title
Changed title
 
Warandecollege 05102010
Warandecollege 05102010Warandecollege 05102010
Warandecollege 05102010
 
Presentatie wijsheidsboeken 9v10 prediker Vineyard Utrecht 18122011
Presentatie wijsheidsboeken 9v10 prediker Vineyard Utrecht 18122011Presentatie wijsheidsboeken 9v10 prediker Vineyard Utrecht 18122011
Presentatie wijsheidsboeken 9v10 prediker Vineyard Utrecht 18122011
 
molson coors brewing ProxyStatement1
molson coors brewing   ProxyStatement1molson coors brewing   ProxyStatement1
molson coors brewing ProxyStatement1
 
毕业年,行走无疆界
毕业年,行走无疆界毕业年,行走无疆界
毕业年,行走无疆界
 
hormel foods 2005_Proxy
hormel foods  2005_Proxyhormel foods  2005_Proxy
hormel foods 2005_Proxy
 
Phylosophy
PhylosophyPhylosophy
Phylosophy
 
Rx for Ad Agencies Suffering From Direct, Digital and Social Media Confusion...
Rx for Ad Agencies Suffering From Direct,  Digital and Social Media Confusion...Rx for Ad Agencies Suffering From Direct,  Digital and Social Media Confusion...
Rx for Ad Agencies Suffering From Direct, Digital and Social Media Confusion...
 
Personality Development Notes
Personality Development NotesPersonality Development Notes
Personality Development Notes
 
Guia de lecturas 2C2010
Guia de lecturas 2C2010Guia de lecturas 2C2010
Guia de lecturas 2C2010
 
Pssssssssssssiu
PssssssssssssiuPssssssssssssiu
Pssssssssssssiu
 
Sociale Innovatie 06102010
Sociale Innovatie 06102010Sociale Innovatie 06102010
Sociale Innovatie 06102010
 
Guía de lecturas Finanzas II 20112 s
Guía de lecturas Finanzas II 20112 sGuía de lecturas Finanzas II 20112 s
Guía de lecturas Finanzas II 20112 s
 

Similar to Mvpvm pattern

RIAアーキテクチャー研究会 第3回 セッション4 Mvpvm pattern
RIAアーキテクチャー研究会 第3回 セッション4 Mvpvm patternRIAアーキテクチャー研究会 第3回 セッション4 Mvpvm pattern
RIAアーキテクチャー研究会 第3回 セッション4 Mvpvm pattern
Mami Shiino
 
Xamarin.formsでのmvvm利用のコツ
Xamarin.formsでのmvvm利用のコツXamarin.formsでのmvvm利用のコツ
Xamarin.formsでのmvvm利用のコツ
Masuda Tomoaki
 
20130316 mix cpp-yuo
20130316 mix cpp-yuo20130316 mix cpp-yuo
20130316 mix cpp-yuoOKUBO_Yusuke
 
ASP.NET MVC 2 ~新機能の紹介~
ASP.NET MVC 2 ~新機能の紹介~ASP.NET MVC 2 ~新機能の紹介~
ASP.NET MVC 2 ~新機能の紹介~
Yoshitaka Seo
 
ASP.NET MVC と jQuery で実践する標準志向 Web 開発
ASP.NET MVC と jQuery で実践する標準志向 Web 開発ASP.NET MVC と jQuery で実践する標準志向 Web 開発
ASP.NET MVC と jQuery で実践する標準志向 Web 開発
Akira Inoue
 
Knockout.js を利用したインタラクティブ web アプリケーション開発
Knockout.js を利用したインタラクティブ web アプリケーション開発Knockout.js を利用したインタラクティブ web アプリケーション開発
Knockout.js を利用したインタラクティブ web アプリケーション開発
Daizen Ikehara
 
ScalaMatsuri 2016
ScalaMatsuri 2016ScalaMatsuri 2016
ScalaMatsuri 2016
Yoshitaka Fujii
 
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話Akira Inoue
 
GUI アプリケーションにおける MVC
GUI アプリケーションにおける MVCGUI アプリケーションにおける MVC
GUI アプリケーションにおける MVC
Yu Nobuoka
 
iOS の動画アプリ開発に Xamarin を使ってみた @JXUG #2 East
iOS の動画アプリ開発に Xamarin を使ってみた @JXUG #2 EastiOS の動画アプリ開発に Xamarin を使ってみた @JXUG #2 East
iOS の動画アプリ開発に Xamarin を使ってみた @JXUG #2 East
irgaly
 
はじめての ASP.NET MVC
はじめての ASP.NET MVCはじめての ASP.NET MVC
はじめての ASP.NET MVC
jz5 MATSUE
 
PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!
Shohei Okada
 
Vue入門
Vue入門Vue入門
Vue入門
Takeo Noda
 
Windows ストア lob アプリ開発のためのガイダンスとフレームワークのご紹介 rev
Windows ストア lob アプリ開発のためのガイダンスとフレームワークのご紹介 revWindows ストア lob アプリ開発のためのガイダンスとフレームワークのご紹介 rev
Windows ストア lob アプリ開発のためのガイダンスとフレームワークのご紹介 revShotaro Suzuki
 
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
U-dai Yokoyama
 
KnockoutJSを使用したアプリケーションの構築例
KnockoutJSを使用したアプリケーションの構築例KnockoutJSを使用したアプリケーションの構築例
KnockoutJSを使用したアプリケーションの構築例
masakazusegawa
 
MvvmCross 入門
MvvmCross 入門MvvmCross 入門
MvvmCross 入門
jz5 MATSUE
 
設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】
設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】
設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】
Tomoharu ASAMI
 
プロダクトに 1 から Vue.js を導入した話
プロダクトに 1 から Vue.js を導入した話プロダクトに 1 から Vue.js を導入した話
プロダクトに 1 から Vue.js を導入した話
Shohei Okada
 

Similar to Mvpvm pattern (20)

RIAアーキテクチャー研究会 第3回 セッション4 Mvpvm pattern
RIAアーキテクチャー研究会 第3回 セッション4 Mvpvm patternRIAアーキテクチャー研究会 第3回 セッション4 Mvpvm pattern
RIAアーキテクチャー研究会 第3回 セッション4 Mvpvm pattern
 
Xamarin.formsでのmvvm利用のコツ
Xamarin.formsでのmvvm利用のコツXamarin.formsでのmvvm利用のコツ
Xamarin.formsでのmvvm利用のコツ
 
20130316 mix cpp-yuo
20130316 mix cpp-yuo20130316 mix cpp-yuo
20130316 mix cpp-yuo
 
ASP.NET MVC 2 ~新機能の紹介~
ASP.NET MVC 2 ~新機能の紹介~ASP.NET MVC 2 ~新機能の紹介~
ASP.NET MVC 2 ~新機能の紹介~
 
ASP.NET MVC と jQuery で実践する標準志向 Web 開発
ASP.NET MVC と jQuery で実践する標準志向 Web 開発ASP.NET MVC と jQuery で実践する標準志向 Web 開発
ASP.NET MVC と jQuery で実践する標準志向 Web 開発
 
Knockout.js を利用したインタラクティブ web アプリケーション開発
Knockout.js を利用したインタラクティブ web アプリケーション開発Knockout.js を利用したインタラクティブ web アプリケーション開発
Knockout.js を利用したインタラクティブ web アプリケーション開発
 
ScalaMatsuri 2016
ScalaMatsuri 2016ScalaMatsuri 2016
ScalaMatsuri 2016
 
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
 
GUI アプリケーションにおける MVC
GUI アプリケーションにおける MVCGUI アプリケーションにおける MVC
GUI アプリケーションにおける MVC
 
iOS の動画アプリ開発に Xamarin を使ってみた @JXUG #2 East
iOS の動画アプリ開発に Xamarin を使ってみた @JXUG #2 EastiOS の動画アプリ開発に Xamarin を使ってみた @JXUG #2 East
iOS の動画アプリ開発に Xamarin を使ってみた @JXUG #2 East
 
はじめての ASP.NET MVC
はじめての ASP.NET MVCはじめての ASP.NET MVC
はじめての ASP.NET MVC
 
PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!
 
Vue入門
Vue入門Vue入門
Vue入門
 
Windows ストア lob アプリ開発のためのガイダンスとフレームワークのご紹介 rev
Windows ストア lob アプリ開発のためのガイダンスとフレームワークのご紹介 revWindows ストア lob アプリ開発のためのガイダンスとフレームワークのご紹介 rev
Windows ストア lob アプリ開発のためのガイダンスとフレームワークのご紹介 rev
 
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
 
Knockout
KnockoutKnockout
Knockout
 
KnockoutJSを使用したアプリケーションの構築例
KnockoutJSを使用したアプリケーションの構築例KnockoutJSを使用したアプリケーションの構築例
KnockoutJSを使用したアプリケーションの構築例
 
MvvmCross 入門
MvvmCross 入門MvvmCross 入門
MvvmCross 入門
 
設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】
設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】
設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】
 
プロダクトに 1 から Vue.js を導入した話
プロダクトに 1 から Vue.js を導入した話プロダクトに 1 から Vue.js を導入した話
プロダクトに 1 から Vue.js を導入した話
 

Recently uploaded

ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobodyロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
azuma satoshi
 
Generating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language ModelsGenerating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language Models
harmonylab
 
無形価値を守り育てる社会における「デー タ」の責務について - Atlas, Inc.
無形価値を守り育てる社会における「デー タ」の責務について - Atlas, Inc.無形価値を守り育てる社会における「デー タ」の責務について - Atlas, Inc.
無形価値を守り育てる社会における「デー タ」の責務について - Atlas, Inc.
Yuki Miyazaki
 
ヒアラブルへの入力を想定したユーザ定義型ジェスチャ調査と IMUセンサによる耳タッチジェスチャの認識
ヒアラブルへの入力を想定したユーザ定義型ジェスチャ調査と IMUセンサによる耳タッチジェスチャの認識ヒアラブルへの入力を想定したユーザ定義型ジェスチャ調査と IMUセンサによる耳タッチジェスチャの認識
ヒアラブルへの入力を想定したユーザ定義型ジェスチャ調査と IMUセンサによる耳タッチジェスチャの認識
sugiuralab
 
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
Osaka University
 
ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMMハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
osamut
 
「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
嶋 是一 (Yoshikazu SHIMA)
 
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
Toru Tamaki
 
Humanoid Virtual Athletics Challenge2024 技術講習会 スライド
Humanoid Virtual Athletics Challenge2024 技術講習会 スライドHumanoid Virtual Athletics Challenge2024 技術講習会 スライド
Humanoid Virtual Athletics Challenge2024 技術講習会 スライド
tazaki1
 

Recently uploaded (9)

ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobodyロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
 
Generating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language ModelsGenerating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language Models
 
無形価値を守り育てる社会における「デー タ」の責務について - Atlas, Inc.
無形価値を守り育てる社会における「デー タ」の責務について - Atlas, Inc.無形価値を守り育てる社会における「デー タ」の責務について - Atlas, Inc.
無形価値を守り育てる社会における「デー タ」の責務について - Atlas, Inc.
 
ヒアラブルへの入力を想定したユーザ定義型ジェスチャ調査と IMUセンサによる耳タッチジェスチャの認識
ヒアラブルへの入力を想定したユーザ定義型ジェスチャ調査と IMUセンサによる耳タッチジェスチャの認識ヒアラブルへの入力を想定したユーザ定義型ジェスチャ調査と IMUセンサによる耳タッチジェスチャの認識
ヒアラブルへの入力を想定したユーザ定義型ジェスチャ調査と IMUセンサによる耳タッチジェスチャの認識
 
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
 
ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMMハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
 
「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
 
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
 
Humanoid Virtual Athletics Challenge2024 技術講習会 スライド
Humanoid Virtual Athletics Challenge2024 技術講習会 スライドHumanoid Virtual Athletics Challenge2024 技術講習会 スライド
Humanoid Virtual Athletics Challenge2024 技術講習会 スライド
 

Mvpvm pattern

  • 2. アジェンダ • はじめに • MVPVM 設計パターン • ナビゲーション • プレゼンター • まとめ
  • 3. はじめに • MSDN マガジン2011年12月号で発表され た「MVPVM 設計パターン」ですが、私も ViewとViewMode​lの両方を知っていて現状 の画面状態を管理する何者かが​必要なこと は感じていました。 • Applicationの派生クラスやApplicat​ionが操 作するオブジェクトとして現状の画面状態 を管​理やナビゲーションをする機能をつ くっていました。今回のセッションでは私 なりに研究した「MVPVM 設計パターン」 をお届けします。
  • 4. MVPVM 設計パターン • モデル - ビュー - プレゼンター - ビューモ デル (MVPVM: Model-View-Presenter- ViewModel) パターンは、 Microsoft patterns & practices の Prism プロジェク トで導入されました。 • MVVM の能力と機能をすべて利用でき、 MVPの拡張性からプレゼンテーションロ ジックの複雑さにも対応でき、ViewModel は本来あるべきプロパティ公開とコマンド の受付になります。
  • 5. MVPVM 設計パターン • MVPVMパターン – それではMVPVMパターンとはなんでしょう か? – MVVMパターン と MVPパターンを合体させた ものです。 – MVVMパターン と MVPパターンを見てみま しょう。
  • 6. MVPVM 設計パターン • MVVMパターン – View:ユーザーインターフェースの外観や配 置や反応(インタラクション)を定義する – ViewModel:Viewの必要な情報をプロパティ で公開しユーザー入力やコマンドを処理する – Model:データの取得や管理を行いプログラム の処理の中核となる
  • 7. MVPVM 設計パターン • MVVMパターン View Model コマンド データバ インド ViewModel プロパ データ取得・更 ティ 新
  • 8. MVPVM 設計パターン • MVPパターン – View:ユーザーインターフェースの外観や配 置や反応(インタラクション)を定義する – Presenter:Viewのナビゲーションを管理し ユーザー入力をModelに伝える – Model:データの取得や管理を行いプログラム の処理の中核となる
  • 9. MVPVM 設計パターン • MVPパターン View Model 入力 Presenter ナビゲーショ データ取得・更 ン 新
  • 10. MVPVM 設計パターン • MVPVMパターン – View:ユーザーインターフェースの外観や配 置や反応(インタラクション)を定義する – ViewModel:Viewの必要な情報をプロパティ で公開しユーザー入力やコマンドをPresenter に渡す – Presenter:ViewやのViewModelのナビゲー ションを管理しユーザー入力をModelに伝える – Model:データの取得や管理を行いプログラム の処理の中核となる
  • 11. MVPVM 設計パターン • MVPVMパターン Presenter ナビゲーショ View ン データ取得・更 新 コマンド データバ データ更新依頼 インド ViewModel プロパ Model ティ
  • 12. ナビゲーション • ナビゲーション – MVVMパターンではどこがナビゲーションを 担当していたのでしょうか? – 答えの一つはメッセージ+ビヘイビアーです。 – ビヘイビアーはViewの分類になります。 – 「ViewModel から View を操作する」という こと葉を聞いたことがある人もいるでしょ う。 – 操作というのはメッセージを送ってメッセー ジボックスやダイアログを表示したりするこ とも多かったのです。
  • 13. ナビゲーション • メッセージボックス public class DialogMessageBehavior : Behavior<DependencyObject> { protected override void OnAttached() { base.OnAttached(); Messenger.Default.Register<DialogMessage>(AssociatedObject, p => Invoke(p)); } protected override void OnDetaching() { base.OnDetaching(); Messenger.Default.Unregister<DialogMessage>(AssociatedObject); } private void Invoke(object parameter) { DialogMessage message = parameter as DialogMessage; MessageBoxResult result = MessageBox.Show(message.Content, message.Caption, message.Button, message.Icon, m essage.DefaultResult, message.Options); message.ProcessCallback(result); } }
  • 14. ナビゲーション • ダイアログ public class DialogMessageBehavior : Behavior<Wndow> { protected override void OnAttached() { base.OnAttached(); Messenger.Default.Register<DialogMessage>(AssociatedObject, p => Invoke(p)); } protected override void OnDetaching() { base.OnDetaching(); Messenger.Default.Unregister<DialogMessage>(AssociatedObject); } private void Invoke(object parameter) { DialogMessage message = parameter as DialogMessage; AssociatedObject.DataContext = message.ViewModel; bool? result = AssociatedObject.ShowDialog(); message.ProcessCallback(result); } }
  • 15. ナビゲーション • ナビゲーション – MVVMパターンでは他にどこがナビゲーショ ンを担当していたのでしょうか? – 答えの一つはViewModel+DataTemplateです。 <DataTemplate DataType="{x:Type c:GreekGodViewModel}"> <TextBlock Text="{Binding Path=Name}" Foreground="Gold"/> </DataTemplate> – さらに DataTemplate をデータによって切り 替える DataTemplateSelector というのもあり ます。 – DataTemplate はViewの分類になります。
  • 16. ナビゲーション • DataTemplateSelector public class TaskListDataTemplateSelector : DataTemplateSelector { public override DataTemplate SelectTemplate(object item, DependencyObject container) { FrameworkElement element = container as FrameworkElement; if (element != null && item != null && item is TaskViewModel) { var taskitem = item as TaskViewModel; if (taskitem.Priority == 1) return element.FindResource("importantTaskTemplate") as DataTemplate; else return element.FindResource("myTaskTemplate") as DataTemplate; } return null; } }
  • 17. ナビゲーション • MVVMパターンは、View と ViewModel は 疎結合でお互いに交換可能であるというこ とが利点の一つであるといわれていまし た。 • どうして今見てきたような密結合が生まれ てしまったのでしょうか? • ナビゲーションは View と ViewModel の両 方を知らないとできません、この場合 View に仕込んでますので ViewModel や 本 来ViewModel にあるべきデータが View に 出てきてしまいます。
  • 18. ナビゲーション • ナビゲーション – MVVMパターンではViewだけがナビゲーショ ンを担当していたのでしょうか? – 答えの一つはアプリケーションクラスです。 – アプリケーションクラスはMVVMパターンの 範囲外です。 – 範囲外であれば別に問題ないのでしょうか? – ナビゲーションを担当する Presenter があれ ばアプリケーションクラスはすっきりするは ずです。
  • 19. ナビゲーション • アプリケーションクラス protected override void OnStartup(StartupEventArgs e) { var win = new Views.TwitterWindow(); this.MainWindow = win; var account = LoadAccount(); if (account == null) account = NewAccountWithDialog(); if (account != null) SaveAccount(account); else { MessageBox.Show("認証失敗"); return; } var vm = new ViewModel.TwitterViewModel( ConsumerKey, ConsumerSecret, account.Token); win.DataContext = vm; win.Show(); base.OnStartup(e); }
  • 20. プレゼンター • プレゼンターの役割 – View と ViewModel のインスタンス作成を行 います。 – View をパネルなどのコンテナに追加し、 DataContext に ViewModel をセットします。 – Model に表示すべきデータを要求し ViewModel にセットします。 – 上位の Presenter や ViewModel の依頼により 更新すべきデータを収集し Model を更新しま す。 – View と ViewModel のインスタンス解放を行 います。
  • 21. プレゼンター • プレゼンターの構成 – Presenter はパネルなどのコンテナで複数の Presenter を管理する Presenter と、ユーザー コントロールやダイアログなどの単一ビュー を管理するPresenter があります。 – View や ViewModel が階層構造になっている ように Presenter も階層構造になります。
  • 22. プレゼンター • プレゼンターの利点 – Application や ViewModel からプレゼンテー ションロジックを解放します。 – View と ViewModel は疎結合でお互いに交換 可能な状態に戻すことにより、再利用性を高 め View や ViewModel をライブラリ化しやす くします。 – View と ViewModel と Model 全てにアクセス 可能な存在なので、アンドゥ・リドゥの実装 場所に最適です。 – ViewModel から View をクローズするメッ セージは必要なくなります。
  • 23. プレゼンター • 親が子供を管理 – ダイアログ を表示させたいPresenterは ダイ アログを管理するPresenterを生成して、ダイ アログが閉じたら解放します。 – パネルなどのコンテナを管理するPresenterは、 パネルの中身を管理するPresenterをパネル内 に表示するときに生成してパネルから削除さ れるときに解放します。
  • 25. プレゼンター • WPFやSilverlightではこんな画面変化も可 能ですが、この場合はコンテナとなるパネ ルにストーリーボードを仕掛けて RenderTransform の TranslateTransform を変化させて表示を変えます。 • 最初にA画面とB画面の View と ViewModel を用意してA画面を表示範囲内 にB画面を表示範囲外に設定してストー リーボードを起動します。
  • 26. プレゼンター • MVVMパターンでは、 A画面とB画面の View と ViewModel を知っている何かの存 在が必要でコンテナの View で実行すると したら、かなりの密結合になってしまった と思います。
  • 27. プレゼンター • MVPVMパターンでは、 A画面のPresenter はA画面の View と ViewModel を知ってい て、 B画面のPresenterはB画面の View と ViewModel を知っています、コンテナの Presenterはコンテナの View と ViewModel の他に、 A画面とB画面の Presenterを知っています。 • 役割分担でき疎結合性も保たれます。
  • 28. まとめ • MVPVMパターンはMVVM の能力と機能を すべて利用でき、 MVPの拡張性からプレ ゼンテーションロジックの複雑さにも対応 できます。 • MVPVMパターンは View と ViewModel は 疎結合でお互いに交換可能な状態に戻すの に有効な手段です。 • 皆さんも検討してみたらどうでしょうか?