Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

StackOverFlowの「MVPとMVCの違い」についての回答を読んでみた

More than 5 years have passed since last update.

MVPとMVCとかMVVMとかの違いについて自分は、あんまりちゃんと分かっていませんでした。

StackOverFlowの「What are MVP and MVC and what is the difference?」という質問の回答が2015/09/23現在、1213人がUsefulにしていて、他の場所でも紹介されていて、読んでみようと思いました。
自信がない場所が多いので、勘違いや間違っている箇所が多々あると思いますので、優しくご指摘をお願いします。。

自分は読んでみて、なんとなく違いがわかったのと、またMVPとPresentation Model(Model-View-ViewModel)の違いについても出てくるので勉強になりました。

What are MVP and MVC and what is the difference?
http://stackoverflow.com/a/101561

Model-View-Presenter

PresenterにはViewのためのUIのビジネスロジックを書く

  • PresenterはViewをデリゲートしてイベントを受け取る
  • PresenterはViewから分離されている。Viewをinterfaceを通して操作する
    • なのでViewをモックとしてテストしやすい

Presenterの特徴

  • View→PresenterとPresenter→Viewをたくさん持っている。
    • 例 : "Save"Buttonクリック→ViewのイベントハンドラはPresenterにデリゲートされているので、Presenterで"OnSave"が呼び出される→セーブが終わったら、PresenterからInterfaceを通してViewにセーブされたよって表示する。

2つのMVPのバリエーション

MVPには2つのバリエーションが有ります。

Passive View

Viewの中のロジックはなるべくなくして、PresenterをViewとModelを仲介させるようにして、Modelがデータに変更があったなどのイベントを発行して、Presenterがそれを受けて、PresenterがViewをアップデートします。完全にModelとViewが分離されています。
Viewには様々なセッターが存在して、View自体では状態を管理せず、Presenterが状態を管理します。

良い点 ViewとModelが綺麗に分かれていてとてもテストがしやすい。
悪い点 たくさんセッターを書かなくてはいけないなど大変です。

イメージ
image

Supervising Controller

データバインディングという仕組みを利用してModelからViewへのバインドする方法です。この場合Presenterで行っていたModelからViewへデータを渡すためのコードが必要なくなります。Presenterにはボタンをおした時のロジックやどこに移動するかのロジックなどが書かれていることになります。

良い点: データバインディングの力によりコードが減らせること
悪い点: データバインディングによりテストのしやすさが減ってしまう。ModelとViewが直接つながるのでカプセル化がうまく行えていない。

image

Model-View-Controller

MVCにおいてControllerは全てのアクションに対して応答するViewを決定する責任があります。
このMVCのMVPとの違いは二点あります。

  • ViewからPresenter(Controller)への呼び出しの流れが違う
    MVCではViewの中のアクションがControllerを呼び出す関係となります。
    例えば、Webにおいて、Viewの中のアクションはURLの呼び出し、それに応答するControllerが処理を行います。そして、コントローラーが処理が終わると、正しいViewを返します。 以下の様な流れとなります。
    Viewの中のアクション
        -> Controllerの呼び出し
        -> Controllerのロジック
        -> Viewを返す
  • ViewがModelに(直接)つながらない
    MVCではViewはシンプルに表示のみです。そして完全に状態を持ちません。Viewに対してのみのロジックがない、すなわちMVCの実装は、MVPだと絶対に必要なViewからPresenterへのデリゲートが無い点です。

イメージ
image

Presentation Model(Model-View-ViewModel)

もう一つの見ておくべきパターンとしてPresentation Modelパターンが有ります。このパターンにおいてPresenterは存在しません。その代わりViewはPresentation Modelと直接バインドします。

Presentation Modelは表示するViewのために作られています。これによりModelとViewが直接つがらないので、MVPのSupervising Controllerの問題点のカプセル化の問題も解消することができます。

この場合、Presentation ModelはModelからのイベントを購読しています。ViewはPresentation Modelから来たイベントを購読して、それを受けて更新を行います。

Presentation Modelは幾つかのコマンドを公開することができます。そのコマンドはViewのアクションを呼び出すためのものです。このアプローチのいいところはPresentation ModelがViewの振る舞いを完全にカプセル化して、コードビハインドを削除できるということです。またModel-View-ViewModelパターンとも呼ばれます。

イメージ
image

takahirom
Google Developers Expert for Android
cyberagent
サイバーエージェントは「21世紀を代表する会社を創る」をビジョンに掲げ、インターネットテレビ局「AbemaTV」の運営や国内トップシェアを誇るインターネット広告事業を展開しています。インターネット産業の変化に合わせ新規事業を生み出しながら事業拡大を続けています。
http://www.cyberagent.co.jp/
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