Встречается на 40% собеседований по Mobile

Знаешь, чем MVVM отличается от MVP

MVVM (Model-View-ViewModel) и MVP (Model-View-Presenter) — это архитектурные паттерны для разделения ответственности в приложении, но они отличаются способом связи View с логикой представления: в MVP Presenter явно управляет View, а в MVVM View автоматически обновляется через механизм привязки данных. Оба паттерна отделяют бизнес-логику от UI, что упрощает тестирование и поддержку кода, но выбор между ними зависит от конкретных требований проекта.

Как устроен MVP

В MVP три ключевых компонента:

  • Model — слой данных и бизнес-логики.
  • View — отображает данные и передаёт действия пользователя (например, нажатия кнопок) в Presenter.
  • Presenter — посредник между Model и View. Он содержит логику представления, обрабатывает действия пользователя, запрашивает данные из Model и напрямую обновляет View.

Связь в MVP однонаправленная: View вызывает методы Presenter, а Presenter обновляет View через интерфейс. Это делает взаимодействие явным, но требует написания большого количества ручного кода для обновления UI.

Пример на Kotlin:

kotlin
interface Contract {
    interface View {
        fun showProgress(show: Boolean)
        fun showData(data: String)
    }

    interface Presenter {
        fun onButtonClicked()
    }
}

class MainPresenter(private val view: Contract.View) : Contract.Presenter {
override fun onButtonClicked() {
view.showProgress(true)
val data = fetchData() // обращение к Model
view.showData(data)
view.showProgress(false)
}
}

text

## Как устроен MVVM

В MVVM также три компонента:

- **Model** — аналогичен Model в MVP.
- **View** — отображает UI и передаёт действия пользователя в ViewModel.
- **ViewModel** — абстракция View, содержит логику представления и подготавливает данные для отображения. ViewModel не знает о View напрямую, а использует привязку данных (data binding) для автоматического обновления UI.

В Android MVVM часто реализуется с помощью `LiveData` или `StateFlow`, которые позволяют View подписываться на изменения данных.

Пример на Kotlin:

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

    fun onButtonClicked() {
        _data.value = fetchData() // обращение к Model
    }
}

// Во View (Activity/Fragment):
viewModel.data.observe(this) { value ->
    textView.text = value // автоматическое обновление
}

Ключевые отличия

КритерийMVPMVVM
Связь View и логикиPresenter напрямую управляет ViewView подписывается на ViewModel через data binding
Обновление UIЯвное, через вызовы методов ViewАвтоматическое, через реактивные механизмы
ТестируемостьView обычно мокируется, Presenter тестируется отдельноViewModel тестируется без View, но требуется настройка binding
СложностьПроще для понимания, но больше ручного кодаМеньше кода, но сложнее отладка при ошибках binding
Зависимость от фреймворкаНе зависит от конкретных библиотекЧасто требует библиотек (например, Android Data Binding, LiveData)

Подводные камни

  • В MVVM при использовании data binding сложно отследить, почему UI не обновился — ошибки часто проявляются только в рантайме.
  • В MVP Presenter может стать слишком «толстым», если в него перенести всю логику, включая бизнес-правила.
  • В MVVM ViewModel не должен содержать ссылок на View (Activity/Fragment), иначе возникает утечка памяти. Используйте LiveData или другие реактивные подходы.
  • В MVP интерфейсы View и Presenter создают дополнительный код, но улучшают тестируемость.

Когда использовать

  • MVP подходит для проектов, где важна явная и простая связь между View и логикой, например, в небольших приложениях или при работе в команде, не знакомой с реактивными подходами.
  • MVVM предпочтителен в современных Android-приложениях, особенно с использованием Jetpack Compose или Data Binding, так как уменьшает количество шаблонного кода и упрощает тестирование ViewModel.

Коротко

  • MVP: Presenter явно управляет View, обновление UI происходит вручную.
  • MVVM: View автоматически обновляется через data binding, ViewModel не зависит от View.
  • MVVM уменьшает количество кода, но требует понимания реактивных механизмов.
  • MVP проще для понимания, но более многословен.
  • Выбор зависит от требований проекта и опыта команды.
как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы