2016-11-09 2 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

Все логики пользовательского интерфейса принадлежат View. Презентатор должен иметь только логику взаимодействия между Model и View. Дело в том, что представление может отличаться - это может быть либо пользовательский интерфейс, либо какой-то модуль, отправляющий комманды через сокеты. Дело в том, что в обоих случаях «логика представления» - поскольку просмотр взаимодействует с данными, остается неизменным, поэтому его необходимо перенести в Presenter. Всплывающие окна, поля и т. Д. - это сведения о представлении вида. Handy practice - создайте Presenter как singleton и введите DI в Activity, который, в свою очередь, реализует View и подключает его к этому представлению. Вы можете избавиться от модели, отправив события из Presenter через EventBus (липкие события). Если вы это сделаете, событие будет ждать, пока действие не получит его (проследить жизненный цикл Activity). Некоторое время назад я столкнулся с этим подходом.

+0

Ну, я могу спорить об этом. Наличие Presenter, который обновляет представление после нажатия кнопки, не отличается от прокрутки 1000 пикселей и запуска события. В любом случае модели остаются отделенными от вида. Все дело в тестировании прецедента и наличии актера, который не обязательно является человеком, но часть пользовательского интерфейса должна рассматриваться одинаково. Подобные события - это не только элементы пользовательского интерфейса, но целая цепочка событий, которые могут (или не могут) взаимодействовать также с моделями. – shadox

+1

Да, я думаю, вы прямо здесь. Попробуйте использовать здесь «посредник» - интерфейс, абстрагирующее событие прокрутки и его реализацию с помощью RecyclerView, который передается вView. Его можно заменить макетным для тестирования. –

Смежные вопросы