MVVMについて25%語る(その内5%は嘘かも)
MVVMは内部処理と画面の処理を分離させる設計。
Model View ViewModelの3つの要素に分ける。
その違いを備忘録としてまとめた。
Model View ViewModelの違い
View
- 端的に言えば「システムにおける画面表示」
- レイアウト定義
- ユーザー操作の割り当て
- 動的に変更したいコントロールや値はバインドする
ViewModel
- 端的に言えば「システムにおける画面表示処理」
- Viewにバインディングする情報をプロパティとして定義
- Modelから受け取った内部データを、画面表示用のデータに変換する役割
- 内部データは作らない。それはModelの債務
- 外部とのやり取りはしない。それはModelの債務
- Viewからユーザー操作を受け取ったら、対応する。また、DBのデータやシステム内部で保持しているデータが必要なら、Modelからもらう
-
Messenger(※1)を使うことでメッセージの登録を行い、Modelからメッセージが送信されたら受信時の処理を行い、画面へ結果を表示する
Model
- 端的に言えば「システムにおける内部処理」
- ViewModelから要求があればデータを作り、値をViewModelに渡す
- 外部からの要求があればデータを作りViewModelへ通知
- データを画面表示用に変換したりはしない。それはViewModelの責務
- 複数のViewModelが同一のModelインスタンスを参照させるためにはModelをシングルトン(※2)にする
実際にModel・ViewModel・Viewの違いがわかる例
ユーザー操作時
- Viewをユーザが操作
- ViewModelはModelのインスタンスからデータを取得するメソッドを呼び出す
- 呼び出したメソッドの戻り値を、ViewModelのプロパティにバインディング
- ユーザー操作反映完了
外部からのデータ受信時
- ViewModelはインスタンス作成時にメッセージのコールバックを登録
- 外部からデータを受信
- Modelは受信したデータを、Modelで保持するデータに変換する
- Modelはメッセージを発行し、作成されているViewModelに対してメッセージを送信
- ViewModelは受け取ったメッセージ種別に対応する処理を行う
※1
Messengerパターン。
Messengerというクラスを使って
メッセージを送受信できる
- メッセージを受信するインスタンスはMessengerクラスへ「Messageの種類と受信時の処理を記述して」登録する
- メッセージを送信するインスタンスは該当するMessageのインスタンスを作成し、送信したいデータがあればそのインスタンスのメンバへ代入。
- Messageクラスが持つSendメソッドでメッセージを送信する。
- メッセージを受信するインスタンスは、2で送った種別のメッセージを受信し、対応する処理を行う。
※2
オブジェクト指向におけるデザインパターンの一つ。
簡単に言えば、インスタンスを2つ以上作らせないようにする。
staticクラスと類似しているが違いがある。
詳しくは考察記事があるので見てみよう。