В чем разница между MVP, MVVM и MVI

«В чем разница между MVP, MVVM и MVI» — вопрос из категории Архитектура, который задают на 24% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

MVP (Model-View-Presenter):

  • View пассивна, делегирует логику Presenter'у.
  • Presenter управляет View через интерфейс, что упрощает тестирование.
    Пример:
interface MainView { fun showData(data: String) }  
class MainPresenter(private val view: MainView) {  
    fun loadData() { view.showData("Loaded") }  
}

MVVM (Model-View-ViewModel):

  • ViewModel хранит состояние и логику, не зависит от View.
  • Связь через DataBinding/LiveData (автоматическая).
    Пример:
class MainViewModel : ViewModel() {  
    val data = MutableLiveData<String>()  
    fun loadData() { data.value = "Loaded" }  
}

MVI (Model-View-Intent):

  • Односторонний поток данных: Intent → Model → View.
  • Состояние иммутабельно, что упрощает отладку.
    Пример:
data class State(val data: String)  
sealed class Intent { object LoadData : Intent() }  
class MainReducer {  
    fun reduce(state: State, intent: Intent) = when(intent) {  
        is Intent.LoadData -> state.copy(data = "Loaded")  
    }  
}

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

  • MVP: ручная привязка View-Presenter.
  • MVVM: автоматическая привязка через реактивные потоки.
  • MVI: строгая односторонность и иммутабельность.