全知全能を目指す人のありがたい雑記

何かしら意味のあるありがた~い話か、意味のない雑念だらけの日記を書く予定です。

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の違いがわかる例

ユーザー操作時

  1. Viewをユーザが操作
  2. ViewModelはModelのインスタンスからデータを取得するメソッドを呼び出す
  3. 呼び出したメソッドの戻り値を、ViewModelのプロパティにバインディング
  4. ユーザー操作反映完了

外部からのデータ受信時

  1. ViewModelはインスタンス作成時にメッセージのコールバックを登録
  2. 外部からデータを受信
  3. Modelは受信したデータを、Modelで保持するデータに変換する
  4. Modelはメッセージを発行し、作成されているViewModelに対してメッセージを送信
  5. ViewModelは受け取ったメッセージ種別に対応する処理を行う

※1
Messengerパターン。
Messengerというクラスを使って
メッセージを送受信できる

  1. メッセージを受信するインスタンスはMessengerクラスへ「Messageの種類と受信時の処理を記述して」登録する
  2. メッセージを送信するインスタンスは該当するMessageのインスタンスを作成し、送信したいデータがあればそのインスタンスのメンバへ代入。
  3. Messageクラスが持つSendメソッドでメッセージを送信する。
  4. メッセージを受信するインスタンスは、2で送った種別のメッセージを受信し、対応する処理を行う。

 ※2
オブジェクト指向におけるデザインパターンの一つ。
簡単に言えば、インスタンスを2つ以上作らせないようにする。
staticクラスと類似しているが違いがある。
詳しくは考察記事があるので見てみよう。

takachan.hatenablog.com