Model-View-Presenter(MVP)スキームはAndroidに役立ちますか?


34

Androidでビューとプレゼンターを分離する方法、ユーザーアクション(MVPのプレゼンター部分)に対する反応は、GUI要素(MVPのビュー部分)を表示する同じアクティビティに設定されます。

「Martin FowlerやMichael Feathers [2]が言うように、モデルビュープレゼンターでは、UIのロジックはプレゼンターと呼ばれるクラスに分離され、ユーザーからのすべての入力を処理し、「ダム」ビューにディスプレイ」(ここから引用)。

今まで、Androidの主な機能の1つは、アクションを実行し、それらに反応して結果を表示するスマートアクティビティであると考えていました。MVPスキームはAndroidの哲学と矛盾していますか?Androidでそれを実現しようとするのは理にかなっていますか?はいの場合、どのようにそれを行うことができますか?


2
+1良い質問です。Androidアプリのソースでmvp / mvvmをまだ見ていません。mvp androidの例と、それらが生成するコード/ライブラリのオーバーヘッドを見るのは面白いでしょう。この問題は、で議論されていなかったStackOverflowの推奨方法・ツー・プロデュースアプリポータブル-間-アンドロイド-と-その他-プラットフォーム
K3B

たぶん、Stackoverflowに入れることができますか、それともルールに反するでしょうか?
ガンヌス

Qestionを複製する代わりに、管理者の1人にこの質問の移行を依頼できます。ここでprogrammersの質問は、より論争の的となる質問「あなたはどう思いますか.... /それは良いか悪いか... stackoverflow」ですが、「アンドロイドにはmvpの例があります」に似ています。私にとっては両方の場所は大丈夫です。
k3b

私は不幸にとても申し訳ありませんが、今まで管理者に接続する方法を見つけていませんでした:
ガンヌス

この質問は、スタックオーバーフローには適していません。ところで-あなたは、「フラグ」リンクを使用して投稿にフラグを立てることにより、モデレーターに連絡できます。
ChrisF

回答:


15

Androidアプリケーションは、基本的にModel-View-Controller(MVC)を中心に構築されています-MVPは同じことのように聞こえますが、この言葉は聞いたことがありません。アクティビティはコントローラーの役割を果たします。XMLビューは、それだけです(アクティビティでプログラムで作成できます、XMLで行う方が簡単で簡単です)。はい、そのモデルは非常に実用的です。

この設計モデルについてあまり聞いたことのない理由として考えられるのは、Androidフレームワークがビューの分離を強制していることです。モバイルデバイス上のアプリケーションは小さい傾向があるため、人々はMVCをフルに使用する傾向はありません。アクションレイヤーがモデルの(小さな)仕事の多くを行うビューレイヤーとアクションレイヤーに向かう傾向があります。

クロスプラットフォームアプリを作成している場合、ビュー、アクション、ビジネスロジック、モデルの4層アプローチを検討することをお勧めします。ビューレイヤーとアクションレイヤーはプラットフォーム固有ですが、ビジネスロジックとモデルは変更されません。基本的に、プレゼンターとユーザーインタラクションをアクションレイヤーに分割します。アクションレイヤーはビジネスロジックレイヤーを呼び出して、ユーザーが望むアクションを実行します。


+1!いくつかの良いテキストを参照してください。
ガンヌス

4
MVPは、Action(=プレゼンテーション)レイヤープラットフォームを独立した状態に保つ機会を提供すると思います-少なくとも、異なるプラットフォームが同様のUI機能を提供する場合。
ドックブラウン

@DocBrown理論的には、はい。実際には、ユーザーの操作がビューまたはプレゼンターのいずれかにヒットする可能性があるため、それが可能になるかどうかはわかりません。たとえば、Androidではスワイプはアクティビティによって処理されますが、Webページではビュー(ブラウザー)によって処理されます。
マイケルK

12
「Androidアプリケーションは基本的にModel-View-Controllerを中心に構築されています」-それは非常に多くのレベルで間違っている、すみません。Androidフレームワークアーキテクチャは、View / Controllerロジックが散らかったGod Classesを中心に構築されています。
イゴールフィリッポフ

2
@IgorFilippovのコメントに1回以上賛成できたらと思います。Androidアプリが設計によりMVCを実装しているという考えは、よくある誤解です。iOSとは異なり、懸念が明確に分離され、分離された、簡単にテスト可能なモデルを可能にするGUIアーキテクチャがAndroidによって強制されません。MVP、MVC、その他のいずれかを自分で提供する必要があります。
ピオベザン

6

Androidプログラミングの経験はありませんが、入門的なAndroidプログラミングチュートリアルを少し見てみると、他のイベント駆動型フレームワークのようにMVPの有用性が低い理由がわかりません。Activityクラスは非常に異なっていないDialogか、Formそれはあなたのアプリケーションのすべてのアクティビティのサブクラスのための「Activitityプレゼンター」クラスを作成し、そこにコア・ロジックを置くために簡単なはずですので、他のフレームワークインチ

「アクティビティ」に送信するイベントはプレゼンターに委任する必要があります。プレゼンターが独自にイベントを送信する場合、または他のシステム依存機能を呼び出す場合、アクティビティはプレゼンターと共有するインターフェースを介して関連機能を提供する必要があります。しかし、それは私が知っている他のGUIフレームワークと基本的に同じです。


+1ありがとうございました。しかし、別の答えからわかるように、Androidでは似たようなモデルが使用されています。「私は50年間散文で話しましたが、それについて知りませんでした!」 次に、モデルの違いを見てみましょう。
ガンヌス

4
@Gangnus:MVPはMVCの特別な形式です。ここではcodebetter.com/jeremymiller/2007/07/26/…詳細を確認できます。そして、これは「MVCまたはMVP」の問題ではないと確信しています。アクティビティは「コントローラ」の一種かもしれませんが、プラットフォームに依存しています。UIロジックをアクティビティごとにプラットフォームに依存しないプレゼンタークラスに分離すると、おそらくユニットテストと移植が容易になります。
Doc Brown

5

MVPはAndroidにとって間違いなく便利です。コードの整理と単体テストに役立ちます。そして、最良の部分は、あなたのコードを読んでいる新しい人々がコードを理解することができ、彼らがどこに行くべきかを知ってすぐに貢献し始めることです。ここに例でMVP理解する非常に役立つリンクがあります。

MVPの3つのコンポーネントすべてについて簡単に説明します

表示する

アンドロイドMVPでは、ビューにはアクティビティ-アンドロイドリソースビュー-Javaインターフェースの2つの事柄が含まれます。ダイアグラムの最初の3ブロックは、ViewとThe Presenterの間の通信を示しています。

プレゼンター

Presenterは、ViewとData / Modelの間の中間層として機能します。View(Activity)は、プレゼンターに何かを提示するように指示し、プレゼンターはデータベース/モデルからデータを取得し、提示可能な形式のデータをビューに返します。ビューは、そのデータを画面に表示します。また、PresenterはプレーンなJavaクラスであり、Androidコンポーネントを含めないでください。そうしないと、Presenterのユニットテストが難しくなります。

プレゼンターでデータベースを使用する場合は、アクティビティでデータベースインスタンスを作成し、プレゼンターに挿入します。これは、単体テスト中にデータベースをモックするのに役立ち、ビジネスロジックをテストできるようになります。

モデル

MVPのモデルは、データソースに他なりません。Viewはデータと直接対話せず、代わりにPresenterにデータを処理し、それ以上の変更をせずに表示できる情報を提供するように指示します。


1
情報は有用です、ありがとうございますが、悪い方法で与えられます。自分のサイトであっても、サイトを引用するだけでなく、ここで情報を提供する必要があります。参照回答は許可されていません。代わりにコメントを使用してください。あなたのサイトに役立つ情報があるからといってフラグを立てているわけではありません。コメントに変更するか、質問の本文に回答している重要な情報を回答に入力してください。そうすれば、あなたは私のプラスだけでなく、答えのチェックも確実に受けるでしょう。
ガンヌス

@Gangnusすべてのコンテンツを入れると答えが非常に大きくなるため、答えに必要な情報を提供しました。
アジットシン

1
実際には2種類のMVPがあります。パッシブビュー(ここで説明したもの)と、モデルへのビューの直接データバインディングを可能にするスーパーバイザープレゼンター(MVVMや多くのWeb MVCフレームワークによく似ています)。
ラバーダック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.