MVVMについて調査してみて、得られた理解をまとめてみます。
走り書きですが、書いてみます。
突っ込みどころがたくさんあるかと思いますが、指摘していただけるとありがたいです。
考えがしっかりでき次第、記事を新たに書き直したいと思います。
MVVM
各クラスが公開インスタンス変数を管理することによって、画面状態の管理を安全に行うアーキテクチャです。
View
ViewModelに設定された公開インスタンス変数に合わせて見た目を構成する責任を持つクラス群です。
[できること]
- ViewModelに自身をObserverとして登録できる
- ViewModelからパラメータ変更の通知を受け取ることができる
- ViewModelのパラメータを参照することができる
- 画面の見た目を公開インスタンス引数として持つ
- ユーザからのアクションを受け取ることができる
- ViewModelに動作を依頼することができる(基本的には横流し)
ViewModel
ユーザに見せる情報を公開インスタンス変数として持ち、管理する責任を持つクラス群です。
[できること]
- Modelに自身をObserverとして登録できる
- Modelからパラメータ変更の通知を受け取ることができる
- Modelのパラメータを参照することができる
- 自クラスのパラメータを更新し、Viewに変更を通知する
- Viewからの動作依頼をメソッド呼び出しの形で受け取ることができる
- 各Modelに動作を依頼することができる
Model
APIアクセス・主要なメモリ・CoreDataの管理責任を持つ
[できること]
- 動作依頼に対し、APIアクセス・主要なメモリ・CoreDataにアクセスできる
- 自クラスのパラメータを更新し、ViewModelに変更を通知する
- ViewModelからの動作依頼をメソッド呼び出しの形で受け取ることができる
メリットとデメリット
- メリット
- 各クラスは自クラスの公開パラメータの管理のみに集中できる(他のクラスの挙動を意識する必要がない)
- クラス内で役割が閉じているためテストがしやすい(多分)
- ビジネスロジックの実行と画面制御を混同することがなくなる
- デメリット
- オブザーバ同期から外れた画面構成を入れられなくなる
- 動作の流れが見えづらくなる
その他
- Model -> ViewModel -> Viewへの情報の流れがリアクティブプログラミングに重なる
- この構成で実装するとvoidを出力とするメソッドが大半になる
- 参考文献