はじめに
MVP, MVVM, MVCのデザインパターンについて記載していく。
なんとなく理解しているが、それぞれの違いを明確に説明はできないな、、と思い改めて学び直してみた。
それぞれの違い
特徴 | MVC | MVVM | MVP |
---|---|---|---|
データフロー | View → Controller → Model → View | View ↔ ViewModel ↔ Model | View ↔ Presenter ↔ Model |
Viewの役割 | UI表示、ユーザー入力の検知 | UI表示、ユーザー入力の検知、ViewModelの変更を監視 | UI表示、ユーザー入力をPresenterに通知 |
Modelの役割 | ビジネスロジックとデータ処理 | ビジネスロジックとデータ処理 | ビジネスロジックとデータ処理 |
中間層の役割 | Controller: ユーザー入力処理、Modelの更新指示 | ViewModel: ViewとModelの仲介、データバインディングやUI表示ロジック | Presenter: ViewとModelの全通信を仲介、UI表示ロジック |
データ更新の仕組み | Viewがモデルの変更を監視 | データバインディングによる自動更新 | Presenterが明示的にViewを更新 |
学習曲線 | 低い | 高(データバインディングの概念学習など) | 中 |
Modelで実装するビジネスロジックについて
アプリケーションの中核となる処理や規則をModelで実装します。
例:
商品の在庫管理ロジック
ユーザーの認証プロセス
複雑な計算処理
これらの処理は、他の層から独立(切り離して)して実装する。
図で表してみた
3つのデザインパターンについて、同じ図を用いて表現してみた。
同じ図なので、それぞれの差異が分かり易いと思う。
MVC
MVVM
MVP
処理の順番が分からないと辛いので、この図だけ処理の順番を番号で振ってる。
MVPとMVVMの違い
図的にも似通っているようにも見えるのが、本質は結構違う。
パッと見分かりづらいと思うので、以下に違いを記載する。
データバインディング
MVVMの最大の特徴は、ViewとViewModelの間で双方向のデータバインディングを使用することです。これにより、ViewModelの状態が変更されると自動的にViewが更新されます。
一方、MVPではPresenterがViewを直接更新します。
責任の分離
MVP: Presenterは、ViewとModelの間の仲介役として機能し、Viewの更新を直接制御します。
MVVM: ViewModelは、Viewに必要なデータと操作を提供しますが、Viewの直接的な制御は行いません。
テスト容易性
MVVMは、ViewModelとViewの疎結合により、ユニットテストがより容易になります。
MVPもテスト容易性が高いですが、PresenterとViewの結合がMVVMよりも強くなる傾向があります。
実装の複雑さ
MVP: 比較的シンプルで、既存のMVCプロジェクトからの移行が容易です4。
MVVM: データバインディングの概念や関連ライブラリ(例:RxSwift)の理解が必要で、学習曲線が急な傾向があります。
適用シナリオ
MVP: 小規模から中規模のプロジェクトに適しており、既存のコードベースへの導入が容易です。
MVVM: 中規模から大規模のプロジェクトに適しており、特に複雑なUIロジックを持つアプリケーションに効果的です。