2017-01-05 5 views
3

をdupicated、GETCURRENTUSER()またはupdateUser(のようないくつかの共通のAPI呼び出しが存在しなければならない)MVPパターンアンドロイドは、それらのそれぞれがかなりユニークである一方で、私は、カップルの活動を持っているプレゼンターのメソッド

MVPパターンを考える(I現在MVP mosbyを使用しています)。これらのアクティビティはそれぞれ1つのプレゼンターしか持たないためです。私が開発しているときに、これらのプレゼンター全員にこれらの一般的なAPI呼び出しの多くをコピー貼り付けすることがあるようです。 C、Eが使用される

、 は

B、A、Cは、プレゼンタ1で使用されている

D.

、Iは、APIコールA、B、Cを有していると言う、D、Aはプレゼンター2で使用されています発表者3 .....

などです。継承する「共通の」プレゼンターを見つけることは本当に難しいです。だから、API呼び出し、CとAは基本的に貼り付けコピーされます。

私の質問は、現在の状況では、コードのコピー貼り付けを避ける最善の方法は何ですか?それはほとんど回避できないのですか?または、OOPを行うのに一生懸命努力すべきですか?APIコールが毎回異なるプレゼンターから追加/削除されるたびにリファクタリングのリスクがありますか?

+0

APIコールはPresenterにありますか? InteractorsにAPI呼び出しを入れることを検討しましたか? APIまたは内部データベースからデータを取得する責任があります。このコードをモデルレイヤー上に置く方が良いでしょう。とにかく、あなたのAPIのコンサルティングをどのようにして消費していますか? Retrofitを使用すると、残りのクライアントのコードがきれいになります。 –

+1

このサンプルプロジェクトはhttp://github.com/mmirhoseini/marvelでご覧になれます。この記事はhttps://hackernoon.com/yet-another-mvp-article-part-1-lets-get-to- know-the-project-d3fd553b3e21を使用して、MVPをよりよく理解してください。 –

答えて

2

すべてのAPI呼び出しを任意のプレゼンターから参照できる1つまたは複数のJavaクラスに入れて、共通のAPIとプレゼンターコードを分離する必要があります。

したがって、 ServiceAが存在します(Javaクラス)。

ServiceAは、APIコールA、B、C、Dを実行します。

サービスAは、Presenter1、Presenter2、PresenterN、PresenterN + 1から呼び出すことができます。 プレゼンターが何であるかは関係ありません。

特定のプレゼンターが異なるAPI呼び出しにアクセスすることを制限したい場合。それでは、ServiceA、ServiceB、ServiceCがあると考えるべきです。 ServiceAがAPIコールAとDのみを行うことができる場合、サービスBとサービスCは同様に動作します。

プレゼンターコードと一般的な(Webサービス、内部API、w/eコード)を切り離すと、コピー&ペーストすることなく拡大/縮小できます。

幸運。

+0

良いアイデア。私はこれが最善の解決策だと思う。プレゼンター/ビューでメジャーなものを変更せずに複製されたコードをリファクタリングします。 – user1017674

0

継承を使用してOOPスタイルを使用しないと、リファクタリングを増やす危険があると思います。 api呼び出しを扱う方法を変更したいとしましょう。コードをコピーする場合は、最初にコードをコピーしたすべての場所をリファクタリングする必要があります。共通のプレゼンターから継承した場合は、一度だけ変更できます。

0

すべてのAPIリクエストを含むAPI用のインターフェイスを作成する必要があります。これらの要求を実行するシングルトンクラスを作成し、プレゼンターからこのクラスに簡単にアクセスできます。

今でもいくつかの重複があり、プレゼンタでこのシングルトンを何度も呼び出す必要があり、それぞれのレスポンスを処理する必要がありますが、これは必要な作業です。すべてのプレゼンターは応答をさまざまな方法で処理できなければならないので、それらを1つにまとめることはできません(データを渡すことで同じ方法で処理することさえあります)。

何もしない同様のコードがたくさん書かれていると思うのであれば、MVPで何を得ることもできます。また、優れたテスト能力、より簡単なリファクタリング、簡単な要求のモックを得ることができます。同じインタフェースを実装したモック用にシングルトンを交換することができます。

2

インタラクタパターン(ユースケースパターン)は、コードの複製に関する現在の問題を解決できます。

考え方は、getCurrentUser()updateUser()のメソッドの背後にあるすべてのロジックをクラス(インタラクタ)に抽出し、このインタラクタを複数のプレゼンタで使用することです。

これは非常に簡単な説明です。例えば、this postthis postで始まるより多くの研究をすることをお勧めします。

関連する問題