2016-07-13 6 views
10

MVPパターンで、UIのクリックを処理するのは誰ですか?
など。 MVPを使用してMVPはViewまたはPresenterのonClick責任ですか?

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

onClickPresenterの責任である:非MVPアプローチのようなものがあることでしょうか?または、Viewはそれを処理できますか?
誰かがこれを明確にしてもらえますか?

答えて

17

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

あなたはView元のための方法が必要になります。

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); 
} 

この方法であなたがプレゼンターから完全にビジネスロジックを分離し、内のコードを複製することなく、あなたのユースケースの概念を使用して再プレゼンター。これはよりクリーンなアプローチです。

MVPアプローチごとにこのgit repoをチェックすることもできます。 https://github.com/googlesamples/android-architecture/tree/todo-mvp-clean/

幸運。

編集:私はMVPを実装しようとしている https://github.com/savepopulation/wikilight

は、ここに私の軽量ウィキペディアクライアントプロジェクトのソースです。 (MVP + Dagger2 + RxJava)

+1

これはMVPのアプローチであれば、私はそれを元のスニペットよりも改善しているとは思えません。 1つの抽象化/リダイレクトを追加しましたが、利点はどこにありますか? – Jim

+1

私たちは、アプリケーションを3つのレイヤーに分割し、ビジネスロジックをUIから分離します。アクティビティとフラグメントはビューであり、uiの更新のみを担当し、プレゼンタから呼び出されるインタフェースメソッドを含んでいます。あなたの例は非常にシンプルなので、利点を見るのは難しいですが、大きなアプリではそれをよりはっきりと見ることができます。また、UIテストにも役立ちます。このリンクをチェックすることができます。 http://antonioleiva.com/mvp-android/ – savepopulation

+4

大きな利点はテストです。上記の例では、Androidフレームワークに依存せずにPresenterで 'onCounterButtonClicked()'メソッドの単体テストを書くことができます。このようなテストは、JVM上で実行できます。私はプレゼンターのメソッド名に 'button'や' click'などの言葉を避けて、Viewレイヤーのコンセプトにリンクすることはあまりありません – Jahnold

関連する問題