Help us understand the problem. What is going on with this article?

MVPとMVVMについてざっくり整理

はじめに

業務では専らAndroidアプリの開発をしています。
ただ、今まではあまりアーキテクチャの学習をしっかりしてこなかった面がありました。
なので今回はAndroid開発でよく耳にするMVPとMVVMの設計方法や考え方について調べ、その内容を自分用に整理してみようと思い、この記事を書いてみました。
今回の投稿が初めてであり、この記事自体もまだざっくりとした概念部分しか書けていないので、引き続き自分で実装してみたり、テストコードを書いてみたりしていこうと考えています。機会があればそちらも随時上げていけたらと思います。
(Androidと言いつつ、Androidのコードは出てきません。。。)

ちなみに、今回参考にさせていただいた書籍はこちら

MVPとは

UIの関心ごとをModel,View,Presenterという3つの役割に分離させたアーキテクチャ
UIの複雑さを解決することを目的としている

  • Model

    • UIに関わるデータを定義しデータ構造を提供するインターフェース
  • View

    • Modelで定義したデータを表示し、イベントをPresenterへ伝える
    • 表示処理を行う受動的なインターフェース
  • Presenter

    • ModelとViewを操作する
    • Modelからデータを取得し、Viewに表示するためのロジックを担当する

mvp.png

意識したい点

・まずは何に於いても各クラスの役割を明確にすること

MVPに限らず、役割を明確にすること、そしてそれ以外のことはさせないことがとても大切。それによって各クラスが自分の役割に専念できるようになり、他のクラスが中で何をやっているかは意識しなくて済むようになる。(単一責任の原則)

・インターフェースを用いることでモックを使ったテストが可能になること

処理を適切なクラスに持たせたり分割したりすることも大切だが、インターフェースを介した作りにすることで、他のクラスに依存しないテストを行うことができるようになる。(Dependency Injection)

Googleが公開しているサンプルコードはこちら

MVVMとは

こちらもUIの分離を目的としたアーキテクチャ
Model,View,ViewModelという3つの役割に分離している
UIとビジネスロジックを関連づけるデータバインディングという仕組みを前提としている

  • Model

    • アプリケーションのドメインモデルを指す
    • データ構造のほかビジネスロジックを表現する手段も含まれる
  • View

    • ユーザーが見る構造、レイアウト、外観を定義する
    • ビジネスに関わるロジックからは分離されている
  • ViewModel

    • ModelとViewの仲介役で、表示に関わるロジックを担当する
    • Modelを操作し、Viewが使いやすい形でデータを提供する

mvvm.png

意識したい点

・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種類だけではないので、他のやり方も学習しつつ、自分のプロジェクトに合った設計方法を見つけていけたらいいなと思います。

satosan
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away