Недостаток MVP над шаблоном дизайна MVVM в android
Привет, я читаю этот пост https://news.realm.io/news/eric-maxwell-mvc-mvp-and-mvvm-on-android/ где они очень хорошо объяснили о mvc, mvp, mvvm. Я понял, как работает шаблон дизайна mvp.
Я не нахожу никаких недостатков в MVP над MVVM. Как они предположили, это проблема
Presenter Concerns - > Maintenance-ведущие, как и контроллеры, склонны собирать дополнительную бизнес-логику, посыпанную со временем. В какой-то дело в том, что разработчики часто оказываются с большими громоздкими докладчиками, которые трудно разбить.
может ли кто-нибудь объяснить, что это значит с примером и как его можно решить с помощью MVVM ?
2 ответов
я большой сторонник MVP и на самом деле не пробовал MVVM. Недостаток возможности a Presenter
выход из-под контроля-это то, с чем у меня был опыт, но его можно смягчить.
в Примере с post бизнес-логика будет относительно простой. Вероятно, есть только одна модель, с которой нужно иметь дело, и не слишком сложная логика.
давайте подумаем о более сложном примере. Скажем, у вас есть приложение, которое продает цветы. Как только пользователь выбрал их букет цветов они получают приняты на экране вариантов заказа, где они могут:
- добавить сообщение к цветам
- выберите вазу подарка
- выберите почтовые адреса
- выберите дату доставки
затем добавьте некоторые требования к домену:
- вы не можете добавить сообщение, если они доставляют за границей
- в некоторых местах имеют разные сроки доставка
- некоторые вазы доступны только с некоторыми цветами
это может быть не лучший UX, но отложив это в сторону, у вас теперь есть Presenter
это имеет дело со многими различными Model
s (учетная запись, адрес, вазы, заказы) и может очень быстро начать принимать на себя многие обязанности, помимо просто сказать View
что отображать и передавать события в Model
. Это нарушает Принцип Единой Ответственности. Также в любое время класс начинает выходить за пределы 500 строк, я начинаю расстраиваться.
решение относительно простое. Вы разделяете все ваши отдельные биты логики на UseCase
классы. Я использую относительно простой базовый класс следующим образом:
public abstract class UseCase<I, O> {
public static final int NO_STATUS = -1;
public Observable<Integer> getStatus() {
return Observable.just(NO_STATUS);
}
public abstract Observable<O> getAction(I input);
}
вы указываете тип ввода и вывода и вводите все необходимые модели в конструктор в конкретном классе реализации. The Presenter
принимает события и вклада View
передает это в соответствующий UseCase
, это затем делает сложную логику с Model
и возвращает соответствующие данные ведущему для обновления View
.
вы можете отправлять периодические обновления статуса обратно на ваш Presenter
используя статус, если необходимо обновить состояние пользовательского интерфейса.
таким образом Presenter
возвращается к простой канал для передачи данных и событий между View
и Model
и бизнес-логика красиво содержится в отдельном классе для каждого действия.
Как во введении MVVP в статье сказано:
MVVM с привязкой данных на Android имеет преимущества более легкого тестирования и модульность, пока также уменьшающ количество кода клея который мы нужно написать, чтобы подключить вид + модель.
основные отличия MVP и MVVP:
- View layer: в MVP ваш вид полностью тупой и пассивный вид. Но в MVVP ваш взгляд более гибкий, потому что он может привязываться к заметный.
- в MVP ваш ведущий заботится почти обо всем из-за тупого взгляда, поэтому он станет действительно большим и сложным постепенно. Между тем, в MVVP ViewModel имеет поддержку из вида (его немного умный :D), особенно привязка данных, вы можете уменьшить часть логических кодов.
- таким образом, вы напишете много кодов для Presenter, и они логически связаны, в которых вам будет трудно сломать.