Комментарии 29
Я думаю, самый подробный ответ на ваш вопрос в статье Как перестать использовать MVVM
Мне нравится MVP. Очень хорошо себя зарекомендовала Moxy. Ничего лишнего, простая в использовании библиотека, избавляет от написания рутинного кода. Ты применяешь MVP на практике и не беспокоишься о том, как реализовать этот паттерн. Киллер-фича Moxy — это восстановление состояния. Советую!
На самом деле, в андроиде уже есть свой MVP: если из фрагмента вынести весь UI-код в кастомные View, то он по сути станет презентером. Только связь со View будет жесткая, а не через интерфейс. У такого подхода на фрагментах есть проблемы:
- Фрагменты сложно тестировать, так как они тянут много android-зависимостей и самостоятельно создают View
- У фрагментов сложный жизненный цикл и они умирают вместе с Activity. При поворотах можно воспользоваться
setRetainInstance(true)
, но это не работает на child-фрагментах. - Нужно писать много рутинного кода для восстановления View
- Жесткая связь со View
Про MVVM ничего не могу сказать, но писать связывание данных в xml меня напрягает. Если интересно, то мой коллега написал хорошую статью про проблемы с ним в андроиде.
Есть еще интересный паттерн Presentation Model, о котором мало кто знает и мало кто говорит. В нем нет тех проблем, что есть в MVVM, но приходится писать код связывания самостоятельно, практически для каждого свойства. Я планирую написать несколько статей о том, как его можно реализовать на андроиде.
В одном подкасте один разработчик рассказывал, что в MVVM когда используется несколько ViewModel, зависящих друг от друга, то используется controller над ними.
К примеру, строка поиска со своей VM, а карточка с результатом со своей. И вот мы нажали поиск в строке поиска и нам надо отобразить прогресс в карточке. Передача этого действия будет через их общий controller.
Есть, конечно, разные пути сделать то же самое. Но я вспомнил это, прочитав ваш пример. Получается, что и в правду, описанный вами подход составляет MVVM в одном из видов реализации связи между VM. В подкасте речь была вроде про WPF.
В контексте этой статьи хочется привлечь внимание к тому, как часто люди называют свои реализации паттернов не теми именами. Это, конечно, не страшно, но создает путанницу.
Так, к примеру, сейчас очень часто можно встретить описание решений типа "какой-то там MVVM". Начинаешь читать и понимаешь, что в этом решении не автоматический датабиндинг, а создается какой-то свой вид биндинга. Но, MVVM - automatic databinding = PresentationModel
, а люди упорно называют это MVVM.
Я надеюсь, что прочитав эту статью вы увидите разницу между этими паттернами и присоединитесь ко мне в том, чтобы называть вещи правильными именами. Хотя бы как дань уважения создателям этих паттернов.
Использую MVVM в WPF приложениях с INotifyPropertyChanged.
В 1979 году! (Я тогда ещё даже не родился).
Я родился в 2005-ом
Различия между MVVM и остальными MV*-паттернами