2016-11-09 9 views
0

私はMVPパターンを使って設計されたアプリを持っています。しかし、私たちの実装のすべてがMVPのベストプラクティスに固執しているとは確信していません。この本で作業することは必ずしも可能ではありませんが、私は非ユーザインタラクションを扱うロジックがどこにあるべきかを判断しようとしています。例えばMVPと非ユーザインタラクション

私は垂直RecyclerViewのスクロールのオフセットを検出する必要があります。スクロールがコンテンツの高さの20%に達したら(大体)、ポップアップを表示する必要があります。今、私のロジックは(擬似コード)

1. Presenter sets View.setVerticalOffsetTriggeringLimit(1000 pixels) 
2. View triggers view event and call Presenter.offsetForPopUpReached() 
3. Presenter triggers View.showPopUp() 
4. pop up is shown 

長所と短所でしょうか?まだテスト可能なコードを持っている間にそれを改善する方法はありますか?プレゼンターをミドルレイヤーとして使用するシステム自体は「ユーザー」ですか?

答えて

0

すべてのUIロジックはViewに属します。 PresenterはModelとViewの間の対話ロジックのみを持つ必要があります。要点は、ビューが異なるかもしれないということです。これは、UIか、ある種のモジュールで、ソケット経由でコマンドを送ることができます。ポイントは、どちらの場合も「プレゼンテーションロジック」 - データとViewの対話が同じであるため、Presenterに移動する必要があるということです。ポップアップ、マージンなどは、View実装の詳細です。 ハンディープラクティス - プレゼンターをシングルトンとして作成し、それをDIで[アクティビティ]に挿入します。次に、ビューが実装され、そのビューに接続されます。 EventBus(スティッキーイベント)経由でPresenterからイベントを送信することで、モデルを削除できます。これを行うと、アクティビティがそれを受け取るまで(アクティビティのライフサイクルを計測する)イベントが待機します。私は少し前にそのアプローチに遭遇しました。

+0

私はそれについて議論することができます。プレゼンターがボタンを押した後にビューを更新することは、1000ピクセルをスクロールしてイベントをトリガーすることと変わりありません。とにかくモデルはビューから離れています。ユースケースをテストし、必ずしも人間ではないがUIの一部であるActorを持つことは、すべて同じように扱われるべきです。この種のイベントは、UIのものだけでなく、モデルともやりとりする(またはしない)イベントチェーン全体です。 – shadox

+1

はい、私はそう思います。 'mediator'を使用してみてください - インターフェイス、抽象スクロールイベント、およびそのインプリメンテーションをRecyclerViewに渡します。これはViewに渡されます。それはテストのためのモックと取り替えることができます。 –