29. MVVMはどんなアプリを作るときも標準の考え方
M : Model
DBやクラウドサービスから入手したデータを入れる箱
V: View
画面に表示して、人間がデータの内容を確認出来るようにする
VM : View Model
画面(V) に表示するために、モデル(M) を複製して、その画面用のモデル(VM) とする
※ 2005年頃 Microsoft で提案され、.net Framework 3.0 から採用。JavaScript や Android にも普及
29
30. MVVM : Model – View – View Model の動き
DBやクラウドから取得した Model を、画面用の View Model に格納
画面にデータバインドで表示
双方向バインドなら V でユーザーが値を変える VM も変わる
プログラムで今度は逆に VM から M に格納、それぞれDBやクラウドに保存する
30
“A” Model
“C” View Model View “C”
Database “A”
Cloud Service “B” “B” Model
データバインド
Data Binding
Web API, WCF
Entity Framework, LINQ to SQL
32. イベントでプロパティを代入するのは古典的
Console アプリでは前から順に値を出力すればいい
昔の Windows / Web はその考え方の延長「イベントでプロパティ代入」で実装されていた
Windows / Web / App 画面を伴うアプリは全てユーザーの入力がある
現代のアプリは DB や複数のクラウドサービスから値を取得・保存する
非同期で(リアルタイムに)画面が更新される
イベントとプロパティ代入では対応出来ない = データバインドが必要
32
33. 昔よく見られた失敗 = 偽3層アーキテクチャ
画面・ロジック・データアクセスを分離する考えは以前からあった
分離する強力な「仕組み」が無かったため、意図を守れない実装も多数
DLL(Visual Studio プロジェクト)は分かれているのに、実際には
プレゼンテーション層に全てのロジックが実装されている場合も・・・
33
Data Tier?
Method “A”
Method “B”
Method “C”
Business
Logic Tier?
Method “A”
Method “B”
Method “C”
Presentation Tier?
事実上、全ロジックが
実装されている
Call Method “A”
Call Method “B”
Call Method “C”
Database
SQL Query Call A, B, C Call A, B, C
MVVMで解決
34. 境界を越えるときは必ずテスト済みであること
責任の所在が明確
DB から M を正しく取得することがテスト済み
M から VM を正しく作れることがテスト済み バグがなく正常に動くはず
VM を V にバインド出来ることがテスト済み
34
“A” Model
“C” View Model View “C”
Database “A”
Cloud Service “B” “B” Model
データバインド
Data Binding
Web API, WCF
Entity Framework, LINQ to SQL
簡単に
品質を保てる
44. 画面の部品のみの F5 デバッグ も出来る
Visual Studio 拡張機能を作る時、ツールウィンドウだけでデバッグ(起動速度が全然違う)
Editor Plus
https://visualstudiogallery.msdn.microsoft.com/af8f350c-b992-464f-b9f3-580b51545f67
44
起動するまで 約3秒起動するまで 約1分
45. UI部品・ロジックを分離してもテストできるか?1
MVVM を理解していれば可能 ⇒ テスト用に部分的に差し替えても正常に動作する
※ Expression Blend を使うと、WPF アプリの「デザイン用サンプルデータ」を作成可能。起動しなくてもUIを確認出来る。
45
“A” Model
“C” View Model View “C”
Database “A”
Cloud Service “B” “B” Model
データバインド
Data Binding
Web API, WCF
Entity Framework, LINQ to SQL
View “C”“C” View Model
Data Binding
テスト用 View Model
を作るプログラム
46. UI部品・ロジックを分離してもテストできるか?2
MVVMの 色んな部分を差し替えることが可能 DBにもインターネットに繋がずにテスト出来る
※他社との連携システムを作成するときは、両者で共通して使える スタブ・ドライバの作成が必須
46
“A” Model
“C” View Model
テスト用
View
Database “A”
Cloud Service “B” “B” Model
データバインド
Data Binding
Web API, WCF
Entity Framework, LINQ to SQL
View “C”“C” View Model
Data Binding
テスト用 Model
を作るプログラム
“A” Model
“B” Model