はじめに
業務では専らAndroidアプリの開発をしています。
ただ、今まではあまりアーキテクチャの学習をしっかりしてこなかった面がありました。
なので今回はAndroid開発でよく耳にするMVPとMVVMの設計方法や考え方について調べ、その内容を自分用に整理してみようと思い、この記事を書いてみました。
今回の投稿が初めてであり、この記事自体もまだざっくりとした概念部分しか書けていないので、引き続き自分で実装してみたり、テストコードを書いてみたりしていこうと考えています。機会があればそちらも随時上げていけたらと思います。
(Androidと言いつつ、Androidのコードは出てきません。。。)
ちなみに、今回参考にさせていただいた書籍はこちら。
MVPとは
UIの関心ごとをModel,View,Presenterという3つの役割に分離させたアーキテクチャ
UIの複雑さを解決することを目的としている
- Model
- UIに関わるデータを定義しデータ構造を提供するインターフェース
- View
- Modelで定義したデータを表示し、イベントをPresenterへ伝える
- 表示処理を行う受動的なインターフェース
- Presenter
- ModelとViewを操作する
- Modelからデータを取得し、Viewに表示するためのロジックを担当する
意識したい点
・まずは何に於いても各クラスの役割を明確にすること
MVPに限らず、役割を明確にすること、そしてそれ以外のことはさせないことがとても大切。それによって各クラスが自分の役割に専念できるようになり、他のクラスが中で何をやっているかは意識しなくて済むようになる。(単一責任の原則)
・インターフェースを用いることでモックを使ったテストが可能になること
処理を適切なクラスに持たせたり分割したりすることも大切だが、インターフェースを介した作りにすることで、他のクラスに依存しないテストを行うことができるようになる。(Dependency Injection)
Googleが公開しているサンプルコードはこちら。
MVVMとは
こちらもUIの分離を目的としたアーキテクチャ
Model,View,ViewModelという3つの役割に分離している
UIとビジネスロジックを関連づけるデータバインディングという仕組みを前提としている
- Model
- アプリケーションのドメインモデルを指す
- データ構造のほかビジネスロジックを表現する手段も含まれる
- View
- ユーザーが見る構造、レイアウト、外観を定義する
- ビジネスに関わるロジックからは分離されている
- ViewModel
- ModelとViewの仲介役で、表示に関わるロジックを担当する
- Modelを操作し、Viewが使いやすい形でデータを提供する
意識したい点
・MVPとの違いは、Model(データ部分)が変更されると、Viewが自動的に更新されるということ
MVPではPresenterがViewへの参照を持っているため、Presenterから明示的にViewを呼び出して更新することができるが、MVVMではViewModelがViewへの参照を持っておらず、Viewを直接更新できない。その代わり、MVVMパターンを利用する場合は、レイアウトファイルを使用してViewModelから観測可能なフィールドをUI要素にバインドすることができる。(Data Binding)
Googleが公開しているサンプルコードはこちら。
所感
MVPにおけるPresenterとMVVMにおけるViewModelの役割は結構似ているなと感じました。まずは役割をMVPの3つに分け、PとVの部分をDataBindingでバインドしてやれば、とりあえずの形だけはMVVMになるのかなという気がしました。あくまで形だけですが(笑)
また、MVVMの方がDataBindingの知識が必要な分、ハードルは高めかなと思います。そういう意味でも、学習するならまずはMVPを理解してからMVVMを始めた方がいいかもしれないですね。もちろん、アーキテクチャはこの2種類だけではないので、他のやり方も学習しつつ、自分のプロジェクトに合った設計方法を見つけていけたらいいなと思います。