Слайд 2
![Стандартные паттерны MVC (Model-View-Controller) MVP (Model-View-Presenter) MVVM (Model-View-ViewModel) Кратко говоря – Model-View-Delegate](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/376954/slide-1.jpg)
Стандартные паттерны
MVC (Model-View-Controller)
MVP (Model-View-Presenter)
MVVM (Model-View-ViewModel)
Кратко говоря – Model-View-Delegate
Слайд 3
![Model Модельки объектов для взаимодействия View и Presenter](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/376954/slide-2.jpg)
Model
Модельки объектов для взаимодействия View и Presenter
Слайд 4
![View Отображение данных, полученных от делегата Передает действия пользователя в делегат Управляется делегатом Не содержит логики](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/376954/slide-3.jpg)
View
Отображение данных, полученных от делегата
Передает действия пользователя в делегат
Управляется делегатом
Не содержит
логики
Слайд 5
![MVC](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/376954/slide-4.jpg)
Слайд 6
![MVP](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/376954/slide-5.jpg)
Слайд 7
![MVC vs MVP](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/376954/slide-6.jpg)
Слайд 8
![MVC vs MVP Presenter управляет View через интерфейс непосредственно, Controller](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/376954/slide-7.jpg)
MVC vs MVP
Presenter управляет View через интерфейс непосредственно, Controller управляет View
опосредованно через Model
Controller может управлять несколькими View, а также переключать их, а Presenter управляет только одной View
Слайд 9
![Наша архитектура Слой данных (Repository, кэширование) MVP](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/376954/slide-8.jpg)
Наша архитектура
Слой данных (Repository, кэширование)
MVP
Слайд 10
![Наша архитектура](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/376954/slide-9.jpg)
Слайд 11
![Пример экрана с MVP](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/376954/slide-10.jpg)
Слайд 12
![Экран авторизации](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/376954/slide-11.jpg)
Слайд 13
![Экран авторизации Проверяем текущее состояние авторизации Ошибка при нажатии кнопки,](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/376954/slide-12.jpg)
Экран авторизации
Проверяем текущее состояние авторизации
Ошибка при нажатии кнопки, когда поля ввода
пустые
Инициация процесса авторизации при выполнении запроса
Показ и скрытие процесса загрузки пользователю
Открытие главного экрана в случае успешной авторизации
Отображение ошибки в поле логина в случае неудачной авторизации
Слайд 14
![AuthView](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/376954/slide-13.jpg)
Слайд 15
![LoadingView](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/376954/slide-14.jpg)
Слайд 16
![Реализуем интерфейс AuthView в AuthActivity](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/376954/slide-15.jpg)
Реализуем интерфейс AuthView в AuthActivity
Слайд 17
![AuthPresenter - поля](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/376954/slide-16.jpg)
Слайд 18
![AuthPresenter - запуск экрана](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/376954/slide-17.jpg)
AuthPresenter - запуск экрана
Слайд 19
![AuthPresenter - обрабатываем нажатие кнопки входа](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/376954/slide-18.jpg)
AuthPresenter - обрабатываем нажатие кнопки входа
Слайд 20
![Используем AuthPresenter](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/376954/slide-19.jpg)
Слайд 21
![Вопросы Насколько такая архитектура масштабируема? Можно ли передавать Context в](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/376954/slide-20.jpg)
Вопросы
Насколько такая архитектура масштабируема?
Можно ли передавать Context в Presenter?
Нужно ли делать
интерфейс или базовый класс для Presenter?
Слайд 22
![Практика](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/376954/slide-21.jpg)
Слайд 23
![Практика Проект GithubMVP Нужно перевести экран walkthrough (описание в WalkthroughActivity)](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/376954/slide-22.jpg)
Практика
Проект GithubMVP
Нужно перевести экран walkthrough (описание в WalkthroughActivity) на MVP
Реализовать экран
списка коммитов (описание в CommitsActivity) в соответствии с паттерном MVP и описанными сценариями
Слайд 24
![Дополнительно - библиотека Mosby](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/376954/slide-23.jpg)
Дополнительно - библиотека Mosby
Слайд 25
![Зачем нужны библиотеки MVP немного увеличивает код Приходится писать много стандартного кода для каждого экрана](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/376954/slide-24.jpg)
Зачем нужны библиотеки
MVP немного увеличивает код
Приходится писать много стандартного кода для
каждого экрана
Слайд 26
![Будьте крайне осторожны! Использование библиотеки для создания архитектуры нарушает первый](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/376954/slide-25.jpg)
Будьте крайне осторожны!
Использование библиотеки для создания архитектуры нарушает первый из принципов
Clean Architecture
Библиотека вынуждает вас писать код в ее рамках
Нужно хорошо изучить конкретное решение перед его использованием
Слайд 27
![Библиотеки Mosby Moxy](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/376954/slide-26.jpg)
Слайд 28
![Преимущества Mosby Структурирование кода и его организация в соответствии с](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/376954/slide-27.jpg)
Преимущества Mosby
Структурирование кода и его организация в соответствии с паттерном MVP
Не
нужно явно хранить View и Presenter в виде полей
Автоматическое связывание View и Presenter
LCE-экраны (Loading-Content-Error)
Слайд 29
![MvpView](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/376954/slide-28.jpg)
Слайд 30
![MvpBasePresenter](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/376954/slide-29.jpg)
Слайд 31
![MvpBasePresenter](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/376954/slide-30.jpg)
Слайд 32
![MvpActivity](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/376954/slide-31.jpg)