Edited at

MVVMについて知っておくべき基礎知識


この記事について

Swiftで最近のトレンドのデザインパターンであるMVVMについてまとめる記事。追記予定。


MVVMとは


  • Model-View-ViewModelのフレームワーク

  • ViewはViewModelを参照、ViewModelはModelを参照

  • その逆は許されない

  • ViewModelの変更をViewに反映させたい場合に、ReactiveCocoaのBidingが便利。

  • 基本的にはViewModelに変更を加えて、その変更がViewに自動的に反映されるイメージ。


MVVMのそれぞれの役割


Model


  • データの保持と型定義

  • ビジネスロジック


    • UIに依存しない、アプリの振る舞いに関するロジック

    • データベースとの通信など




View


  • UIの出力

  • UIのコンポーネントとViewModelをバインディングする。


ViewModel


  • エラーハンドリング

  • イベントを元にデータをModelから取ってくる。

  • UI出力のためのロジック(プレゼンテーションロジック)


    • ビューの更新やページ遷移



  • ビジネスロジック


    • 原則ビジネスロジックはModelに記載すべきという通説はあるも、ViewModelに記載される場合もある。




MVVMのメリット


Massive ViewControllerが解消される


  • MVVMを使うことで、Controllerが以前抱えていたビジネスロジックをModel、プレゼンテーションロジックをViewModelに移すことになる。よって、ViewControllerが小さくなる。

  • 単一責務の原則が実現しやすくなり、アプリの振る舞いが把握しやすくなる

  • 長いViewControllerのファイルを上下に行ったり来たりする必要がなくなる。


Testがしやすくなる


  • Viewの部分を独立させることで、ビジネスロジックだけをテストすることが可能になる。

  • 表示のためのロジックをViewを見なくてもテストすることができる。


MVVMで起こりうる問題


  • Fat ViewModelとなってしまう。


    • View Modelにロジックを書き込んで行くため、しばしばViewModelが大きなサイズになってしまう。単一責務の原則が果たされなくなってしまう。そんな場合は以下の対策をする。

    • ViewModelを複数のViewModelに分割する

    • ViewModelの責務をModel層に持って行く。

    • 可能な限り、1クラス一つの責務とするのが大事。




参考

https://qiita.com/s_emoto/items/b000a5c076f3d6076972

https://medium.com/flawless-app-stories/how-to-use-a-model-view-viewmodel-architecture-for-ios-46963c67be1b