MVPって何?

shinnaga
·

MVPって何となく知っているけど、MVCと何が違うか説明出来るレベルじゃないので深掘り

MVPの概要

  • [M]odel [V]iew [P]resenterの略語、MVCと大きな違いはController→Presenterとなっているところ

  • MVCでは、UserActionをControllerが受け取り、View/Modelへアクションを繋げていたが、MVPではUserActionはViewで受ける。

  • 但し、依存関係としてView↔Presenter↔Modelの流れなので、Presenter層がView層に干渉できるようにinterfaceを用意してあげ、Presenterから操作可能とする。

  • MVPのバリエーションは下記2つが存在(普段認識するのは前者)

    1. PassiveView

      Viewの中のロジックをなるべくなくし、PresenterがViewのロジック部分を担う(テストしやすいけど、Interface書くの面倒くさい)

    2. SupervisingController

      ViewがModelへデータバインディングで取得し、PresenterはModel更新に務める(interface分のコード量は減るけどテストしづらい)

各層の責務

  • Model

    • アプリケーションの状態(データとビジネスロジック)を管理

    • 状態変更をPresenterから受け付け

    • 状態変更をPresenterへ通知

    • 外部ストレージ(DB等)へのアクセス

  • View

    • UI表示

    • UserActionの受け付け

    • UserActionをPresenterへ通知

    • UserActionをPresenterから受け付け

  • Presenter

    • View側のビジネスロジック

    • ViewとModelの仲介

    • ViewとModelへの直接参照を避けることでテスト容易性を向上できる

実装してみての感想

メリット

  • 各層を分離することで、主たる役割が明確化されることは保守性や運用性を考えて、コードの見通しが確保される為にだいぶメリットが大きい!

  • 概念として難しいPresenter層は、最初は役割を曖昧に理解してたが、実際に使用してみると案外悩むこと無く取り入れられる。

  • テスト容易性について、実際にUnitTest、WidgetTest、IntegrationTestのコードも実装してみたけど、UT→Presenter、WT→View、IT→複数Viewを対象にテストを書くことが出来る為、整理して書くことが出来るかなと思う。

デメリット

  • データバインドの為に各画面にInterfaceが必要となるのが面倒くさい。。

  • イベントを全てPresenterで担うため、Presenterも画面ありきで作成しなければならない

  • データバインドについては、状態管理ツールをProviderやRiverpod使えば解決策ありそうかも、、

参考資料