Moxy. Как правильно пользоваться? / Юрий Шмаков (Arello Mobile)Ontico
РИТ++ 2017, AppsConf
Зал Касабланка, 6 июня, 16:00
Тезисы:
http://appsconf.ru/2017/abstracts/2704.html
В последнее время паттерн MVP будоражит Android-комьюнити. Уже есть несколько довольно приличных библиотек, которые помогают использовать этот подход. Но с ними вам придётся писать много boilerplate-кода. Поэтому я хочу познакомить вас с Moxy. Покажу, как использовать её компоненты для решения задач, которые будут вставать перед вами, когда вы решите использовать паттерн MVP. И расскажу, как устроены эти компоненты, и почему именно так, чтобы вы не боялись использовать Moxy из-за потенциальных подводных камней.
«Как я научился не волноваться и полюбил Android-MVP», Никита Бартишок, ABBYYMail.ru Group
Доклад о подходе к разработке Android-приложений с использованием MVP и Clean Architecture. Никита рассмотрит преимущества этого подхода перед традиционным, уделит отдельное внимание вопросам сохранения состояния в Android-MVP, а также особенностям взаимодействия между V и P.
Разработка WPF приложений в стиле ViewModel FirstDenis Tsvettsih
Презентация к докладу «Разработка WPF приложений в стиле ViewModel First» с одиннадцатой конференции dotnetconf (Челябинск, 31 октября 2015)
http://dotnetconf.ru/materialy/viewmodelfirst
Moxy. Как правильно пользоваться? / Юрий Шмаков (Arello Mobile)Ontico
РИТ++ 2017, AppsConf
Зал Касабланка, 6 июня, 16:00
Тезисы:
http://appsconf.ru/2017/abstracts/2704.html
В последнее время паттерн MVP будоражит Android-комьюнити. Уже есть несколько довольно приличных библиотек, которые помогают использовать этот подход. Но с ними вам придётся писать много boilerplate-кода. Поэтому я хочу познакомить вас с Moxy. Покажу, как использовать её компоненты для решения задач, которые будут вставать перед вами, когда вы решите использовать паттерн MVP. И расскажу, как устроены эти компоненты, и почему именно так, чтобы вы не боялись использовать Moxy из-за потенциальных подводных камней.
«Как я научился не волноваться и полюбил Android-MVP», Никита Бартишок, ABBYYMail.ru Group
Доклад о подходе к разработке Android-приложений с использованием MVP и Clean Architecture. Никита рассмотрит преимущества этого подхода перед традиционным, уделит отдельное внимание вопросам сохранения состояния в Android-MVP, а также особенностям взаимодействия между V и P.
Разработка WPF приложений в стиле ViewModel FirstDenis Tsvettsih
Презентация к докладу «Разработка WPF приложений в стиле ViewModel First» с одиннадцатой конференции dotnetconf (Челябинск, 31 октября 2015)
http://dotnetconf.ru/materialy/viewmodelfirst
55+1 прием для улучшения Javascript-кода / Татьяна Бабич (Simbirsoft)Ontico
В докладе будут рассмотрены приемы, практики и «фишки», которые полезно использовать для создания любого Frontend-приложения.
Мы поговорим об организации модульности и компонентов на примере приложений с Angular, React и Polymer. Обсудим, как использовать особенности JavaScript, и рассмотрим особые случаи, когда фреймворки действительно приходят на помощь.
Рендеринг может больше: vue.js vs React, Андрей СолодовниковDevDay
О том, как перестать вручную контролировать DOM, писать логику навигаций и почему DOM-шаблонизация — это классно, а так же немного самокритики и сравнительных тест-кейсов.
Разработка Web-приложений на Angular JS. Архитектурные семинары SoftengiSoftengi
Разработка Web-приложений на Angular JS — доклад Бориса Левицкого, архитектора ПО в команде портфеля проектов Enviance компании Softengi.
Видео с докладом от автора можно посмотреть по ссылке: http://youtu.be/oTXxrmIxo8Y
Презентация ответит на вопросы:
- что такое Angular?
- для чего он используется и что с ним можно делать?
- как работает Data-Binding?
- кастомные фильтры
- структура Angular приложения
Архитектурные семинары Softengi - еженедельные встречи, на которые приглашаются ведущие разработчики/архитекторы Softengi и других компаний нашего консорциума Intecracy Group.
Все проведенные семинары мы записывали, и теперь хотим поделиться опытом и знаниями с такими же профессионалами.
Подписывайся на канал Softengi https://www.youtube.com/user/softengi и узнай первым о новых семинарах.
http://www.softengi.com
Сегодня многие фреймворки, такие как Prism или Autofac, позволяют разработчику организовать модульную структуру приложения. При этом часто бывает непонятно, для чего ещё нужны модули, кроме как для пресловутой "красоты архитектуры".
В рамках доклада я расскажу о том, какие существуют подходы к организации модульной структуры, в каких фреймворках они реализованы и для решения каких задач дает преимущество каждый подход.
В лекции рассказано о доступных средствах по отладке веб-сайтов, их возможностях, а также способах их использования. Также речь пойдет о том, как искать ошибки у пользователей в продакшене и контролировать качество продукта.
Мир мобильных телефонов очень сильно изменил нашу жизнь. В наше время невозможно представить современного человека, без этого чудо устройства. На рынке появляется все больше устройств и приложений. И чтобы удобнее пользоваться этими приложениями пользователи выбирают “умные” телефоны, или как их еще принято называть смартфоны. В своем докладе я хочу поделиться своим опытом автоматизации приложений под Android и iOS. Я расскажу о том, какие инструменты автоматизации я использовал. Поговорим о недостатках этих инструментов и какие из них стоит использовать у себя на проекте.
55+1 прием для улучшения Javascript-кода / Татьяна Бабич (Simbirsoft)Ontico
В докладе будут рассмотрены приемы, практики и «фишки», которые полезно использовать для создания любого Frontend-приложения.
Мы поговорим об организации модульности и компонентов на примере приложений с Angular, React и Polymer. Обсудим, как использовать особенности JavaScript, и рассмотрим особые случаи, когда фреймворки действительно приходят на помощь.
Рендеринг может больше: vue.js vs React, Андрей СолодовниковDevDay
О том, как перестать вручную контролировать DOM, писать логику навигаций и почему DOM-шаблонизация — это классно, а так же немного самокритики и сравнительных тест-кейсов.
Разработка Web-приложений на Angular JS. Архитектурные семинары SoftengiSoftengi
Разработка Web-приложений на Angular JS — доклад Бориса Левицкого, архитектора ПО в команде портфеля проектов Enviance компании Softengi.
Видео с докладом от автора можно посмотреть по ссылке: http://youtu.be/oTXxrmIxo8Y
Презентация ответит на вопросы:
- что такое Angular?
- для чего он используется и что с ним можно делать?
- как работает Data-Binding?
- кастомные фильтры
- структура Angular приложения
Архитектурные семинары Softengi - еженедельные встречи, на которые приглашаются ведущие разработчики/архитекторы Softengi и других компаний нашего консорциума Intecracy Group.
Все проведенные семинары мы записывали, и теперь хотим поделиться опытом и знаниями с такими же профессионалами.
Подписывайся на канал Softengi https://www.youtube.com/user/softengi и узнай первым о новых семинарах.
http://www.softengi.com
Сегодня многие фреймворки, такие как Prism или Autofac, позволяют разработчику организовать модульную структуру приложения. При этом часто бывает непонятно, для чего ещё нужны модули, кроме как для пресловутой "красоты архитектуры".
В рамках доклада я расскажу о том, какие существуют подходы к организации модульной структуры, в каких фреймворках они реализованы и для решения каких задач дает преимущество каждый подход.
В лекции рассказано о доступных средствах по отладке веб-сайтов, их возможностях, а также способах их использования. Также речь пойдет о том, как искать ошибки у пользователей в продакшене и контролировать качество продукта.
Мир мобильных телефонов очень сильно изменил нашу жизнь. В наше время невозможно представить современного человека, без этого чудо устройства. На рынке появляется все больше устройств и приложений. И чтобы удобнее пользоваться этими приложениями пользователи выбирают “умные” телефоны, или как их еще принято называть смартфоны. В своем докладе я хочу поделиться своим опытом автоматизации приложений под Android и iOS. Я расскажу о том, какие инструменты автоматизации я использовал. Поговорим о недостатках этих инструментов и какие из них стоит использовать у себя на проекте.
Архитектура кода нового 2ГИС Web API или куда мы дели MVCDevDay
Сергей Коржнев
Архитектор версии 1.4 2ГИС Web API
Архитектура кода нового 2ГИС Web API или куда мы дели MVC
Тезисы:
● Как организован код в старой версии.
● Вдумчиво смотрим, как мы используем Yii, хватаемся за голову и клавиатуру. Там отрезаем, тут пришиваем, и вуаля!
● Ну и делаем выводы, как мы забороли две классические проблемы программирования: борьба с дублированием кода и сложностью системы.
Подробная статья по докладу: https://habrahabr.ru/company/mobileup/blog/314838/
Team Lead MobileUp Константин Цховребов выступил в Новосибирске на IT-конференций DevFest.
Поделиться азами гибкой простой и функциональной навигации по экранам при использовании MVP в Android. Рассказал, как сделать код навигации чистым и lifecycle-безопасным, а любую, даже самую навороченную цепочку переходов по экранам – делом пары строк.
Разработка Windows 8 приложений глазами WPF/Silverlight программистаDenis Tsvettsih
Презентация к докладу «Разработка Windows 8 приложений глазами WPF/Silverlight программиста» с десятой конференции dotnetconf (Челябинск, 19 апреля 2015)
http://dotnetconf.ru/materialy/windows8
Automation Functional Testing in Agile ProjectsAndrey Rebrov
Об автоматических тестах писал ещё Сам Кент Бек. Ну, а автоматические функциональные тесты — это вообще лакомый кусок для современных agile методик разработки ПО. Вместе с участниками кемпа мы узнаем, с какой стороны подходить к процессу автоматизации тестирования в целом. Кроме того, мы создадим проект автотестирования с использованием одного из самых популярных продуктов для тестирования веб-приложений — Selenium 2.
Где кончается react native? / Павел Кондратенко (Rambler&Co)Ontico
РИТ++ 2017, Frontend Сonf
Зал Мумбаи, 5 июня, 11:00
Тезисы:
http://frontendconf.ru/2017/abstracts/2496.html
В своем выступлении я расскажу про то, как библиотека бумажных книг в нашей компании переехала в онлайн и причем тут react native. Погружаясь в архитектуру этой технологии я постараюсь дать представление о том, что можно выжать из нее и где заканчиваются ее возможности. Разберем потоки в приложении, возможные проблемы и все это на таких простых примерах как ActivityIndicator.
Если у вас еще не дошли руки до react native, но всегда хотели разобраться - приходите обязательно! Из моего доклада вы сможете, как минимум, получить представление об этой технологии.
2. Чт о т а кое MVP
Основные составляющие: Model, View и Presenter
• :Плюсы
• ,Код разбивается на мелкие независимые кусочки
• Сильно упрощается написание тестов к коду
• - ,Легко менять какую то часть не ломая при этом другую
• :Минусы
• Кода становится больше
• К этому подходу нужно привыкать
• На данный момент не сильно распространённый
3. MVP в Andr oi d
Позволяет снять метку GodObject с Activity:
• GUIПолное управление
• Обработка взаимодействия с пользователем
• Запуск асинхронных задач
• Обработка результата асинхронной задачи
• :Дополнительные хотелки
• View должна привязываться к уже имеющемуся Presenter при смене
конфигурации
• View всегда обязана иметь актульаное состояния
• Presenter -должен уметь жить независимо от чего то
4. Moxy – т е ория
View
ViewState
Presenter Model
Commands
5. Moxy – т е ория
View
ViewState
Presenter Model
Commands
6. Moxy – т е ория
View
ViewState
Presenter Model
Commands
7. Moxy – т е ория
View
ViewState
Presenter Model
Commands
8. Moxy – т е ория
ViewState
Presenter Model
Commands
View
9. Moxy – т е ория
ViewState
Presenter Model
Commands
View
10. Moxy – т е ория
ViewState
Presenter Model
Commands
View
11. Moxy – т е ория
ViewState
Presenter Model
Commands
View
View
13. Moxy – MvpPr e s e nt e r
• -Содержит в себе часть бизнес логики
• -Отвечает только за одну логическую единицу бизнес логики
• Типизирован MvpView
• :Имеет полезные методы
• voidattachView(View view) и voiddetachView(View view)
• View getViewState()
• voidonFirstViewAttach()
• boolean isInRestoreState(View view)
14. Moxy – MvpVi e w и MvpVi e wSt a t e
• MvpView ,описывает команды которые Presenter может передать
во View
• MvpViewState ,хранит команды которые были переданы во View
• MvpViewStateимеет метод voidrestoreState(View view)
• Чаще всего не придётся самостояетльно создавать
MvpViewState
15. Moxy – @I nj e c t Vi e wSt a t e
• Применяется к классу MvpPresenter
• :Имеет три поведения
• Если указан параметр value, то будет использован указанный ViewState
• Если указан параметр view, то будет сгенерирован ViewState для
указанной View
• ,Если никакой параметр не указан то будет сгенерирован ViewState
для View, которой типизирован Presenter(опасайтесь типизированных
View)
• Позволяет работать с методом View getViewState()
16. Moxy – St a t e St r a t e gy
• Управляет нахождением команды во ViewState
• Имеет два callback- :метод
• voidbeforeApply(currentState, incomingState)
• voidafterApply(currentState, incomingState)
• Указать стратегию можно аннотацией @StateStrategyType
• @StateStrategyType :можно применить
• Ко всему интерфейсу View
• К конкретному методу интерфейса View
17. Moxy – MvpDe l e ga t e
• Управляет жизненным циклом Presenter
• Подставляет во View правильный экземпляр Presenter
• Отвечает за привязку View к Presenter
• Имеет несколько методов для получения состяния View:
• voidonCreate(Bundlebundle), voidonCreate() и voidonDestroy()
• voidonStart()
• voidonSaveInstanceState(BundleoutState)
• voidsetParentDelegate(MvpDelegatedelegate, StringchildId)
18. Moxy – @I nj e c t Pr e s e nt e r
• Применяется к Presenter-полям реализации View
• Сообщает MvpDelegate, какой Presenter нужно использовать
• Может быть двух(с половиной) :типов
• PresenterType.LOCAL
• PresenterType.GLOBAL и PresenterType.WEAK
• , !=В случае если тип PresenterType.LOCAL, MvpDelegateбудет
искать Presenter :по одному из правил
• ,По статичному тэгу указанному в параметре tag
• Используя factory, сгенерирует тэг и сам Presenter, по необходимости
19. Moxy – Mode l
:Содержит в себе работу с данными
• Получение данных
• Из хранилища
• Из интернате
• Хранение данных
• Обработка данных
,Самое подходящее место чтобы разгуляться DI
20. Moxy – приме р #1
:Задача сделать экран авторизации
• :По нажатию на кнопку входа
• Показать диалог запроса
• Начать асинхронный запрос авторизации
• :После завершения асинхронного запроса авторизации
• Скрыть диалог прогресса
• ,Если пришла ошибка то показать диалог с ошибкой
• ,Если авторизация прошла успешно то перейти на главный экран
21. Moxy – приме р #1
:Задача сделать экран авторизации
:Решение
•Сделать SignInView
•Сделать SignInPresenter
•Сделать SignInActivity
22. Moxy – приме р #1
@StateStrategyType(AddToEndSingleStrategy.class)
public interface SignInView extends MvpView
{
void toggleProgress(boolean show);
void showError(Exception exception);
void hideError();
void onSignIn();
}
public class SignInActivity extends MvpActivity implements SignInView
{
@InjectPresenter
SignInPresenter mSignInPresenter;
...
23. Moxy – приме р #1
@InjectViewState
public class SignInPresenter extends MvpPresenter<SignInView>
{
@Inject
Repository mRepository;
public SignInPresenter()
{
WagamamaApplication.getAppComponent().inject(this);
}
public void auth(final String login, final String password)
{
getViewState().hideError();
getViewState().toggleProgress(true);
↓↓↓
↓↓↓
mRepository.authentication().signIn(login, password)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<AuthenticateData>()
{
@Override
public void onCompleted()
{
getViewState().toggleProgress(false);
getViewState().onSignIn();
}
@Override
public void onError(Throwable e)
{
getViewState().toggleProgress(false);
getViewState().showError(new Exception(e));
}
});
24. Moxy – приме р #2
:Задача сделать аудиоплеер
•В приложении есть список треков
• Текущий трек выделяется и имеет кнопку play/ pause
• ,В приложении есть фрагмент в котором отображается
,текущий трек его состяние и кнопки play/ pauseи prev/ next
•Приложение отображает notification с отображением текущего
,трека его состяние и кнопок play/ pauseи prev/ next
25. Moxy – приме р #2
:Задача сделать аудиоплеер
:Решение
•Сделать PlayerView
•Сделать PlayerPresenter
•Сделать PlaylistAdapter
•Сделать PlayerFragment
•Сделать PlayerService
26. Moxy – приме р #2
public interface PlayerView extends MvpView
{
String PLAYER_STATE = "playerState";
@StateStrategyType(SingleStateStrategy.class)
void setCurrentTrack(TrackInfo track);
@StateStrategyType(value = PlayerStateStrategy.class, tag = PLAYER_STATE)
void playTrack();
@StateStrategyType(value = PlayerStateStrategy.class, tag = PLAYER_STATE)
void pauseTrack();
}
27. Moxy – приме р #2
public class PlayerStateStrategy implements StateStrategy
{
@Override
public <View extends MvpView> void beforeApply(List<Pair<ViewCommand<View>, Object>> currentState,
Pair<ViewCommand<View>, Object> incomingState)
{
for (Pair<ViewCommand<View>, Object> viewCommand : currentState)
{
if (viewCommand.first.getTag().equals(PlayerView.PLAYER_STATE))
{
currentState.remove(viewCommand);
break;
}
}
currentState.add(incomingState);
}
@Override
public <View extends MvpView> void afterApply(List<Pair<ViewCommand<View>, Object>> currentState,
Pair<ViewCommand<View>, Object> incomingState)
{
}
}
28. Moxy – приме р #2
public class PlayerPresenter extends MvpPresenter<PlayerView>
{
public static final String TAG = "player";
public PlayerPresenter()
{
super();
PlayerApp.get().getBus().register(this);
}
@Subscribe
public void playTrack(PlayTrackEvent event)
{
playTrack(event.getTrack());
}
public void playTrack(TrackInfo trackInfo)
{
getViewState().setCurrentTrack(trackInfo);
getViewState().playTrack();
}
↓↓↓
↓↓↓
public void playTrack()
{
getViewState().playTrack();
}
public void pauseTrack()
{
getViewState().pauseTrack();
}
@Override
public void onDestroy()
{
super.onDestroy();
PlayerApp.get().getBus().unregister(this);
}
}
29. Moxy – приме р #2
public class PlaylistAdapter extends BaseAdapter implements PlayerView
{
@InjectPresenter(type = PresenterType.WEAK, tag = PlayerPresenter.TAG)
PlayerPresenter mPlayerPresenter;
public PlaylistAdapter(MvpDelegate<?> parentDelegate)
{
MvpDelegate<PlaylistAdapter> delegate = new MvpDelegate<>(this);
delegate.setParentDelegate(parentDelegate, "");
delegate.onCreate();
}
...
public class MainActivity extends MvpActivity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
PlaylistAdapter adapter = new PlaylistAdapter(getMvpDelegate());
...
30. Moxy – приме р #2
public class PlayerService extends Service implements PlayerView
{
@InjectPresenter(type = PresenterType.WEAK, tag = PlayerPresenter.TAG)
PlayerPresenter mPlayerPresenter;
private MvpDelegate<PlayerService> mDelegate;
@Override
public void onCreate()
{
super.onCreate();
mDelegate = new MvpDelegate<>(this);
mDelegate.onCreate(null);
mDelegate.onStart();
}
...
@Override
public void onDestroy()
{
super.onDestroy();
mDelegate.onDestroy();
...
31. Moxy – приме р #2
public class PlayerFragment extends MvpFragment implements PlayerView
{
@InjectPresenter(type = PresenterType.WEAK, tag = PlayerPresenter.TAG)
PlayerPresenter mPlayerPresenter;
...
32. Moxy – конкуре нт ы
главный конкурент– одинMosby с неудобным ViewState
33. Moxy – ит ог о
• :Что имеем
• Решены проблемы с жизненным циклом
• -Всегда отображается актуальное состояние бизнес логики
• Codegeneration
• :Важные советы
• Не меняйте View командой из View
• Добавляйте и удаляйте элементы View только через Presenter
• ,Если не компилится внимательно вчитайтесь в описание ошибки
• Используйте DI для связки Presenter↔Model
• MVP != инструмент
34. На почит а т ь
• Moxy — MVP Androidреализация под с щепоткой магии
• AndroidApplication Architecture(AndroidDev Summit 2015)
• AndroidTestingCodelab
• Nucleus
• Mosby
• OldMosby
• STINSON'SPLAYBOOK FORMOSBY
• AndroidReactiveMVP: практика
• AndrtoidClean Architecture
• . Speaker Clean Architecture MVPАлексей Макаров и
• Mosby issues 85