MVVMについて勉強したことのまとめ
今更ながら、MVVMな開発をお仕事で行なっています。
全然理解できていないので、色々と調べつつメモを残していきます。
また、こんな実装はMVVMじゃない?ってきなことも今後の反面教師になるように記載してみました。
MVVM
- プログラムを3つの要素、Model、View、ViewModel に分割
- 各要素は、単方向に依存している View -> ViewModel -> Model
- MVVMは、あくまでUI周り構成について触れているだけであって、Modelの中身については、各自で考える必要がある
View
- ViewModelの情報を使用してUIを描画 = binding
- ViewModelにアクションを送信 = commands
ViewModel
- UIに描画するのに必要な情報を準備、保持 = Modelを保持?
- Viewから送られたアクションをModelに通知
- Modelから、UIの描画に必要な情報に変換保持
Model
- ViewとViewModelがやること以外全て受け持つ
- つまり、データ本体、加工、取得、保存などは、VMで行わず全てMdoelが受け持つ
こんな実装はMVVMじゃない?
Viewの場合
- ViewがVMのプロパティを直接操作している
- ViewがアクションをVMに送るときに、コールバッグ(blockやobservable)を実行する
- ViewがViewModelから受け取る描画内容変更処理内で、新たにVMの操作をしている
- View内でViewModelを差し替えることができない
また、ViewModelを差し替えたときにUIが元の状態に戻らない - DataBindingを使ってない
DataBindingを使わないと、MVPのPresenterをViewModelと言っているだけな気がしてます。(人によって解釈が変わるみたいなので、正しくはどうなんでしょうか・・)
ViewModelの場合
- ViewModelがModelのプロパティを直接操作している。なるべく、アクションとして通知、操作する
- Viewを知っている
- ViewModel内でModelを差し替えることができない
また、Modelを差し替えたときにUIが元の状態に戻らない - Modelの情報をViewに通知する以外の機能を実装している = ビジネスロジックが実装されている
Modelの場合
- View・ViewModelを知っている
MVVMと一緒に紹介されるVIPERについて(主にiOS用)
VIPERは、以下の頭文字から命名されていて
- View
- Interactorinteractor(Model)
- Presenter
- Entity
- Rotuer
Entity以外は全てProtocolに準拠して実装するので、全体的に疎結合にできるアーキのようです。
Clean ArchitectureをiOSに適用したものって感じのようです。
MVPの不明瞭な画面遷移周り規約がある感じのアーキテクチャですが、
Presenter <=> View 部分に、DataBindingを用いることで、MVVMにも使用できると思います。