Почему все переходят с MVP на MVVM

Ответ

MVVM предлагает более декларативный подход через Data Binding и LiveData/Flow, что уменьшает boilerplate-код. В отличие от MVP, где Presenter активно управляет View, MVVM автоматически обновляет UI при изменении данных, снижая связность.

Пример с LiveData:

class MyViewModel : ViewModel() {
    private val _data = MutableLiveData<String>()
    val data: LiveData<String> = _data

    fun fetchData() {
        _data.value = "Updated"
    }
}

// В Activity/Fragment:
viewModel.data.observe(this) { text -> 
    textView.text = text 
}

Плюсы MVVM:

  • Лучшая поддержка Jetpack (ViewModel, LiveData, Room).
  • Проще тестирование (ViewModel не зависит от Android-контекста).
  • Удобнее для реактивного программирования (Coroutines/Flow).

MVP же требует ручного обновления View и чаще приводит к утечкам памяти из-за сильных ссылок на Activity/Fragment.

Ответ 18+ 🔞

Слушай, а вот этот твой MVVM — это реально ёпта прорыв после MVP, который как будто на дворе 2002-й год. Представь себе: в MVP твой презентер — это такой занудный контролёр, который орет на вьюху: «Слушай сюда, сука, обнови вот это поле! А теперь вот это! А теперь скрой кнопку!». Это ж пизда рулю, ручное управление, как на тракторе.

А тут приходит MVVM и такой: «Э, сабака сука, расслабься, чувак». Ты просто объявляешь: «Вот эта текстовая хуйня привязана к этому куску данных». И всё. Данные поменялись — интерфейс сам обновился, как по волшебству. Никакого крика, никакого ручного тыканья. Это ж овердохуища удобно!

Вот смотри на этот код, тут вся магия:

class MyViewModel : ViewModel() {
    private val _data = MutableLiveData<String>()
    val data: LiveData<String> = _data

    fun fetchData() {
        _data.value = "Updated"
    }
}

// В Activity/Fragment:
viewModel.data.observe(this) { text ->
    textView.text = text
}

Видишь? Вьюмодель говорит: «У меня есть data». Фрагмент подписывается на неё одним махом — observe. И всё. Когда ты вызываешь fetchData() и меняешь значение, текст вьюхи меняется сам. Никаких вызовов типа view.showUpdatedText("Updated"). Занавес. Живи спокойно.

И плюсы, блядь, просто огонь:

  • Поддержка Jetpack — это вообще отдельная песня. ViewModel, LiveData, Room — они все друг за друга держатся, как гомосеки налетели. В MVP же тебе приходилось эти штуки костылять самому, и получалась какая-то мудя.
  • Тестирование — вот тут вообще удивление пиздец насколько проще. ViewModel — это просто класс, ему похуй на Android. Запускаешь юнит-тест и проверяешь логику без всяких эмуляторов и роботов. В MVP же презентер вцепился в вьюху мертвой хваткой, и чтобы его протестировать, надо городить заглушки — терпения ноль ебать.
  • Реактивщина — сейчас все помешаны на корутинах и Flow. Так MVVM с ними идеально дружит. Ты просто вьюмодель запускает поток данных, а вьюха на него подписывается. В MVP ты бы этот поток ещё обратно в презентер тащил, а тот бы его вручную впихивал во вьюху. Хуй с горы, проще говоря.

А главная беда MVP — это утечки памяти, ёб твою мать. Презентер часто держит сильную ссылку на Activity, и если её повернуть, а потом забыть почистить — всё, приехали, активити висит в памяти как призрак. Во вьюмодели с её lifecycle-aware хуками такого пиздеца просто не бывает. Она сама понимает, когда её пора на свалку истории.

Короче, выбор очевиден. MVP — это как ездить на Запорожце: вроде едет, но стучит, дымит и бензин хавает как не в себя. А MVVM — это уже нормальная тачка с климат-контролем и подогревом сидений. Ебушки-воробушки, да похуй, что там кто-то говорит про «лишнюю сложность» — сложность она только сначала, зато потом живёшь как сыр в масле катаешься.