既存のイベント駆動開発のWPF/Silverlightでの問題 MVC系パターンとMVVMの関係について そもそもWPF/Silverlightで書くという事 WPF/Silverlightは、既存のUI技術(Windows Forms/ASP.NET)より高い表現力を持つからこそ採 用されます 既存のUIより高い表現力を持つという事は? 既存のアプリケーションより、UIに関わる機能の割合 が増えます。 既存のイベント駆動型開発では なぜWPF/Silverlightの開発は難しいか? イベント駆動開発 – イベントハンドラ 前述の通り、WPF/Silverlight開発ではUIの挙動に 関わるコードの割合が増えます。 イベント駆動開発を行った場合、UIのコードビハイ ンドは大幅に「業務ロジック呼出をしない」イベン トハンドラが増える事になります。 Windowサイズ変更 子のインスタン化待ち 論理ツリー走査 Windowサイズ変更時 業務ロジック呼出A 業務ロジック呼出A クリック時に色を変える 業務ロジック呼出B 進捗表示 VisualTree走査 コード量 増大 クリック時に色を変える 進捗表示 業務ロジック呼出B DispatcherTimer イベント駆動開発 – コントロールの仮想化 また、WPF/Silverlightでは WindowsForms/ASP.NETに比べてコレクションコ ントロール(Grid/List/TreeView)などの仮想化が徹 底的に進んでいます。 こんなTreeView・・・ 神奈川県をチェックしたら、子の市区町村にも チェックを入れたい! イベント駆動開発 – コントロールの仮想化 また、WPF/Silverlightでは WindowsForms/ASP.NETに比べてコレクションコ ントロール(Grid/List/TreeView)などの仮想化が徹 底的に進んでいます。 こんなTreeView・・・ Window Formsなら、 イベントハンドラで簡単! Webなら、 Javascriptで簡単! 神奈川県をチェックしたら 子の市区町村にも チェックを入れたい! しかしWPFだと・・・・ イベント駆動開発 – コントロールの仮想化 また、WPF/Silverlightでは WindowsForms/ASP.NETに比べてコレクションコ ントロール(Grid/List/TreeView)などの仮想化が徹 底的に進んでいます。 こんなTreeView・・・ TreeViewを展開するまで 子のチェックボックスの インスタンスがありません! 神奈川県をチェックしたら 子の市区町村にも チェックを入れたい! (デフォルト) イベント駆動開発 – コントロールの仮想化 また、WPF/Silverlightでは WindowsForms/ASP.NETに比べてコレクションコ ントロール(Grid/List/TreeView)などの仮想化が徹 底的に進んでいます。 こんなTreeView・・・ では、どうする? まさか、 子コントロールのインスタンスが できるまで別スレッドで待ちますか? 神奈川県をチェックしたら 子の市区町村にも チェックを入れたい! イベント駆動開発 – コントロールの仮想化 また、WPF/Silverlightでは WindowsForms/ASP.NETに比べてコレクションコ ントロール(Grid/List/TreeView)などの仮想化が徹 底的に進んでいます。 こんなTreeView・・・ 神奈川県をチェックしたら 子の市区町村にも チェックを入れたい! WPFなら データバインド で対処します データバインディング は、WPF/Silverlight の前提技術です イベント駆動開発 – コントロールの仮想化 また、WPF/Silverlightでは WindowsForms/ASP.NETに比べてコレクションコ ントロール(Grid/List/TreeView)などの仮想化が徹 底的に進んでいます。 WPF/Silverlightでイベント駆動開発をしていると、 ほぼ必ず、UIの制御方法が混在します! イベントハンドラによる制御と、 データバインドによる制御と・・・ イベント駆動開発 – まとめ WPF/Silverlightでのイベント駆動開発は、コードビハイ ンドのメソッド量が大幅に増えます もともとイベント駆動開発には、「イベント処理順によ るイベントハンドラの呼び出し順がコードから見えな い」という問題がありますが、それがより顕在化します。 テストが困難です。手法が制限されます。 イベント処理順に依存したコードの保守で苦労した経験 はありませんか? また、イベントハンドラだけにUIの制御を統一するのは ほぼ不可能です イベント駆動開発 コードビハインドのイベントハンドラの数は増大し、 コントロールの仮想化が進んだ事によって、 イベント発生順に加えてインスタンス化のタイミング まで把握しなければならず、 イベントハンドラによるUI状態の制御と、データバイ ンドによるUI状態の制御が混在する・・・ そんなコードを保守したいですか? そもそもそんなコードを書けますか? より機能の増えたUIで! MVC(Model-View-Controller)系はWPF/Silverlightに適して いないの? MVC系パターン 色々な派生があります。 MVP/プレゼンテーションモデル/アプリケーション モデル 詳細は@matarilloさんのページに matariilo.com UIパターン http://matarillo.com/general/uipatterns.php 最大の目的はビジネスロジックに対するViewの抽 象化! 各種派生パターンも、上記目的を果たすために基盤 技術の変化などに伴ってカスタマイズされてきただ けであって、決してお互いに相反するものではあり ません! MVCパターン系 「MVVMパターンは、MVC/MVPと比べてどういっ たメリットがあるんでしょうか?」という声をたま に聞きます MVC系の目的は、究極の所、ビジネスロジックに対 するViewの抽象化というだけです。この目的はUI設 計パターンとしてはきわめて汎用的であり、目的を 同一にするパターンはもともと相反しません。 大事な事なのでもう一度いいます。 MVVMパターンはMVC系パターンです。 ではなぜMVC/MVPパターンじゃないの? MVVMパターンという言葉が生まれた事で、 MVC/MVPパターンはWPF/Silverlightに適していな いのだという思い込みが浸透しつつあるように思え ます。 おそらくは、MVC/MVPをWPF/Silverlightの基盤に 合わせて適用しようとするとMVVMにならざるを得 ないというだけの事です。MVC/MVPを定義通りに 適応可能か見ていきます ※MVC/MVPなどのGUIパターンには各種派生・流派 があるため、今回は比較的シンプルな定義に沿ってみ ていきます。 MVC 古典的MVC Controller View Model ⑤更新 MVC 古典的MVC Controller View Model ⑤更新 MVC 古典的MVC リッチクライアント開発環境 でのコントロールは、View とControllerの機能を併 Controller せ持つ事が多いため、 ViewとControllerを分 けて考えるメリットがそ もそも少ない View Model ⑤更新 MVC ViewはModelの監視のみが、遷移のトリガーとな 古典的MVC るため、Modelに所属しない情報(非ビジネスドメ インロジック)を元にViewは状態遷移できません Controller そもそも古典的なMVCは、非ビジネスドメインロ ジックを保持する場所がありません (MVCがそもそも抱える問題) View 神奈川県をチェックしたら 子の市区町村にも チェックを入れたい! Model ⑤更新 こういったModelまで届かない ロジック・状態を持つ場所がありません MVC 古典的MVC View また、②と④が分離している事 で、WPF/Silverlightの TwoWayデータバインディン Controller グ機構を使用できません。 TwoWayデータバインディング が使えないと、たとえばWPFで 標準で用意されたデータ検証の 仕組み(ValidationRules)を使用 できません。 Model ⑤更新 MVP MVP Presenter View Model ⑥Modelの変化を受け 更新 MVP MVP Presenter Presenterは、MVCの問題であった「非ビ ジネスドメインロジック」を担当する場所 として機能します。 View Model ⑥Modelの変化を受け 更新 MVP こういったシンプルな MVPは、シンプルなMVC Presenter 以上にGUIコントロール の存在が、各役割の分担 を複雑化させます。 MVP View GUIコントロールは、② と④の役割を分担するの も妨げるでしょう。 Model ⑥Modelの変化を受け 更新 ではWPF/Silverlightの様にModel とController(あるいはPresenter) を分離するメリットがない場合 は・・・? PM Presentation Modelパターン MVC(MVP)にて、実装技術に依存してViewと Controller(Presenter)を分離するメリットが見当た らない場合に適応 ViewはPresentationModelを レンダリングするだけ View 監視 Presentation Model Model 監視 ViewとPresentationModelは 綿密に同期するため、データバインド機 構などがないと大変 PM Presentation Modelパターン これがほぼ MVVM MVC(MVP)にて、実装技術に依存してViewと Controller(Presenter)を分離するメリットが見当た らない場合に適応 ViewはPresentationModelを レンダリングするだけ View Presentation Model Model 今までのパターンで一番 監視 監視 WPF/Silverlightに ViewとPresentationModelは 妥当ですよね? 綿密に同期するため、データバインド機 構などがないと大変 MVC系パターン – まとめ MVC/MVPは、諸派あるが、そもそも諸説あるとい う捉え方がおかしい。実装テクノロジ中立ではない から、実装テクノロジごとに各パターンの実装があ るだけ。 WPF/SilverlightではシンプルなMVC/MVPを適 用する事は難しいし、要件を満たしにくい PresentationModelパターンが妥当 PresentationModelパターンをWPF/Silverlight の基盤に合わせて構築しなおしたのがMVVMパター ン! MVVMパターン Model/View/ViewModelパターン PresentationModelパターンを、WPF/Silverlightの 基盤を使用して実装の制約を追加し、進化させたも の PresentationModelとViewの同期の仕組みを、 WPF/Silverlightの基盤を利用する仕組みに変更 PrensentaitonModel = ViewModel(ほぼ) View ViewModel Model PresentationModelパターンとの違い PresentationModelパターンは、Viewと PresentationModelを綿密に同期させる必要がある。 しかし、PresentationModelはViewを参照すべきで はない ViewはPresentationModelを監視している 本来PresentationModelパターンは、Viewを薄く、 PresentationModelのレンダリング機能のみと留め る事で、PresentationModelがViewを参照する事な く、Viewとの疑似相互アクションを実現している View Presentation Model PresentationModelが 変化する度にViewのレ ンダリングが行われる イメージ? PresentationModelパターンとの違い 同様にMVVMパターンは、ViewとViewModelを綿 密に同期させる必要がある。しかし、ViewModelは Viewを参照すべきではない ViewはViewModelを監視している ViewからViewModelへの通知は、リフレクション によって行われる。ViewModelからViewへの通知 は、イベントによって行われる。 WPF/Silverlight基盤を利用した相互作用 リフレクション ViewModel View イベント発行 PresentationModelパターンとの違い MVVMパターンでのViewとViewModelの相互機能 に使われるリフレクションとイベントは、基本的に データバインディング機構によって隠ぺいされてい る。 開発者がリフレクションとイベント、Viewと ViewModelの相互同期の仕組みにについて意識する 必要は無い。 View データバインディング ViewModel なぜ隠ぺいするのか?- Interactionのリスク もともとオブジェクトに設計パターン用の責任を持 たせた場合、相互作用(Interaction)は設計パターン そのものを崩壊させやすい Presenter 例えばMVPのここ・・・ もし④がIF経由じゃな かったら・・・・ View なぜ隠ぺいするのか?- Interactionのリスク もともとオブジェクトに設計パターン用の責任を持 たせた場合、相互作用(Interaction)は設計パターン そのものを崩壊させやすい Presenter ViewとPresenterが 相互依存!? Viewに書くべきロジック・ Presenterに書くべきロジック をきちんと分離するのは難しく View なるでしょう! なぜ隠ぺいするのか?- Interactionのリスク もともとオブジェクトに設計パターン用の責任を持 たせた場合、相互作用(Interaction)は設計パターン そのものを崩壊させやすい Presenter MVPパターンでは、④ をインターフェース経由 と規定する事により、 疎結合とし、相互依存の リスクを軽減しています View なぜ隠ぺいするのか?- Interactionのリスク もともとオブジェクトに設計パターン用の責任を持 たせた場合、相互作用(Interaction)は設計パターン そのものを崩壊させやすい Presenter それではInterface経由なら パターンを守れる??? View なぜ隠ぺいするのか?- Interactionのリスク もともとオブジェクトに設計パターン用の責任を持 たせた場合、相互作用(Interaction)は設計パターン そのものを崩壊させやすい Presenter PresenterがViewをキャストしてイ ンスタンスにしてしまえばViewを直接 いじれてしまうし・・・・ どうしても規約ベースの管理にならざ View るを得ない・・ じゃあ 理想は・・・・? 設計パターンとそのインフラが、 開発者の実装がパターン からはずれないよう制約 する事が望ましい! なぜ隠ぺいするのか?- MVVMのInteraction MVVMパターンの相互作用(Interaction) リフレクション ViewModel View イベント発行 リフレクションとイベントによるInteraction がWPF/Silverlightの基本です これ、隠蔽せずに開発したら・・大変な事に なりますよね? なぜ隠ぺいするのか?- MVVMのInteraction だからWPF/Silverlightは、 View データバインディング ViewModel データバインディングというインフラの機構とし てリフレクションとイベントを隠ぺいし、 リフレクションとイベントを開発者に意識させ ず・自由に使わせずという形を実現しました! なぜ隠ぺいするのか?- MVVMのInteraction MVVMパターンはWPF/Silverlightデータバインディ ング機構に加えて、InteractionMessageという仕組 みも加えて、イベントとリフレクションを徹底的に 隠蔽します データバインディング View ViewModel InteractionMessage なぜ隠ぺいするのか?- MVVMのInteraction データバインディングとInteractionMessageは、開 発者がパターンを破壊するコードを記述する事をイ ンフラとして自然に隠蔽します また、ViewModelはViewをインターフェースすら 意識する必要がなくなり、よりレベルの高い疎結合 が実現されます。 データバインディング View ViewModel InteractionMessage (補足)InteractionMessage データバインディング機構は、Viewと下位レイヤの Interactionに有効ですが、Viewがバインドする下 位レイヤにバインドするデータがあることが前提で す。 そのため、Viewでのエラーダイアログボックスの表 示や、画面遷移など、揮発性の現象に対しては不自 然な実装を強いられます。 Viewの下位レイヤからの揮発性のアクションを実現 するための仕組みがInteractionMessageです。 (補足)InteractionMessage しかし現在、.NET Framework4/Silverlight4にお いて、標準でInteractionMessageは導入されていま せん。 Pattern & Practice Prismにおいて InteractionMessageは導入されています。P & Pに 採用されている以上、いずれは標準ライブラリでの 採用が見込まれるでしょう 参考):MVVM勉強会資料 http://ugaya40.net/wpf/mvvm-study- resource.html MVVMパターン – まとめ MVVMパターンは、MVC系の理念を持つパターンで あり、WPF/Silverlightの基盤特性に最も適した MVC系亜種PresentationModelパターンを、さら にWPF/Silverlightの基盤機能に合わせて特化させ たもの。 PresentationModelパターンと比べるとMVVMパ ターンは、WPF/Silverlight/.NETの基盤技術をフル 活用する事で、開発者がパターンを破壊するコード を記述する事を防ぎやすくしている MVVM Future コードビハインドが初めから無いMVVMテンプレー トのVisualStudioへの導入。 Expression Blendビヘイビア・トリガー・アクショ ンの、標準ライブラリへの導入 Viewに宣言的に機能を追加できる PrismのInteraction/InteractionMessageTriggerの 標準ライブラリへの導入 参考資料 各UIパターン概要 matarillo.com UIパターン http://matarillo.com/general/uipatterns.php PMパターンとMVVMパターンの関連 MSDN マガジン February 2009 Model-View-ViewModel デザイン パターンによる WPF アプリケーション http://msdn.microsoft.com/jajp/magazine/dd419663.aspx THE CODE PROJECT Presentation Model (MVVM) Good Practices http://www.codeproject.com/KB/silverlight/pmgoodpractic es.aspx MARTIN FOWLER Presentation Model http://martinfowler.com/eaaDev/PresentationModel.html
© Copyright 2024 ExpyDoc