web-dev-qa-db-ja.com

MVPでは、ViewまたはPresenterのonClick責任はありますか?

MVPパターンで、UIのクリックの処理を担当するのは誰ですか?
例えば。 MVP以外のアプローチは次のようになります。

counterButton.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
      totalClicks++;
      counterTextView.setText("Total clicks so far: "+totalClicks);
    }
  });

MVPの使用はonClickPresenterの責任ですか?または、Viewがそれを処理できますか?
誰かがこれを明確にしてくれませんか?

22
Jim

OnClickはPresenterメソッドを呼び出す必要があります。あなたはプレゼンターでビジネスを行う必要があり、UIを更新する必要がある場合は、Viewでメソッドを定義してプレゼンターから呼び出す必要があります。

View exのメソッドが必要です:

public void showCounterCount(final int totalClicks){
     counterTextView.setText("Total clicks so far: "+totalClicks);
}

また、Presenterにメソッドと変数が必要です。

int totalClicks = 0;

public void onCounterButtonClicked(){
    totalClicks++;
    mView.showCounterCount(totalClicks);
}

次のようにコードをリファクタリングします。

counterButton.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
      mPresenter.onCounterButtonClicked();
    }
  });

より複雑でクリーンなアーキテクチャの場合、インタラクターでユースケースビジネスを実行できます。 (あなたの例では、カウンター値の増加はあなたのアプリケーションのユースケースです)

インタラクターを定義し、そこでカウンター値をインクリメントできます。

CounterInteractor:

public CounterInteractor{
   public int incrementCounter(int currentCounter){
       return currentCounter+1;
   }
}

そして、以下のようにプレゼンターをリファクタリングしてください:

int totalClicks = 0;
CounterInteractor mCounterInteractor = new CounterInteractor();

public void onCounterButtonClicked(){
    totalClicks = mCounterInteractor.incrementCounter(totalClicks);
    mView.showCounterCount(totalClicks);
}

このアプローチでは、ビジネスロジックをプレゼンターから完全に分離し、プレゼンターでコードを複製せずにユースケースの概念を再利用します。これはよりクリーンなアプローチです。

このgitリポジトリで、さまざまなMVPアプローチを確認することもできます。 https://github.com/googlesamples/Android-architecture/tree/todo-mvp-clean/

幸運を。

編集:

これが私の軽量のWikipediaクライアントプロジェクトソースです: https://github.com/savepopulation/wikilight

MVPを実装しようとしています。 (MVP + Dagger2 + RxJava)

32
savepopulation

MVPでは、クリックをキャプチャする方法を知ることはViewの責任であり、クリックで何を行うかを決定するのではありません。 Viewがクリックをキャプチャするとすぐに、Presenterで関連するメソッドを呼び出して、それに作用する必要があります。

- - - - - - - - - - 見る - - - - - - - - - -

button1.setOnClickListener(new OnClickListener({
presenter.doWhenButton1isClicked();
}));

- - - - - - - - - プレゼンター - - - - - - - -

public void doWhenButton1isClicked(){
// do whatever business requires
}

Androidのアーキテクチャパターンに関する一連の記事があります パート はMVPに関するものです。あなたはそれが役に立つかもしれません。

4
Ali Nem