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

Ответ

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: строгая односторонность и иммутабельность.

Ответ 18+ 🔞

А, ну вот, опять эти ваши архитектурные паттерны! Сидишь такой, думаешь — какой выбрать, а нихуя не понятно, в чём разница. Сейчас я тебе на пальцах объясню, чтобы даже мартышлюшка вроде меня поняла.

Смотри, есть у нас три главных хуя с горы: MVP, MVVM и MVI.

MVP (Model-View-Presenter): Представь, что View — это тупая красивая морда приложения. Она вообще нихуя не умеет, только показывает кнопки и картинки. А весь мозг, вся логика — это Presenter. Эта хитрая жопа сидит и командует: «Эй, View, покажи вот это! Эй, View, спрячь то!». View ему подчиняется через специальный договор (интерфейс). И тестировать это — одно удовольствие, потому что Presenter от View не зависит, можно подсунуть любую заглушку. Вот, смотри на код, не бзди:

interface MainView { fun showData(data: String) }
class MainPresenter(private val view: MainView) {
    fun loadData() { view.showData("Loaded") }
}

Presenter говорит View, что делать. Всё просто, как три копейки.

MVVM (Model-View-ViewModel): А тут уже поинтереснее. ViewModel — это не командир, а скорее хранилище состояния и логики. Она не тыкает View пальцем, а просто говорит: «У меня тут данные обновились». А View сама, через волшебные технологии вроде DataBinding или LiveData, подписывается на эти изменения и обновляется автоматически. Никаких прямых команд! Это как будто у тебя в комнате датчик температуры, и кондиционер сам включается. Удобно, блядь. Глянь:

class MainViewModel : ViewModel() {
    val data = MutableLiveData<String>()
    fun loadData() { data.value = "Loaded" }
}

Вызвал метод — данные в LiveData обновились — View сама всё подхватила и отрисовала. Ёпта, магия!

MVI (Model-View-Intent): А это уже для самых отъявленных перфекционистов, у которых терпения ноль ебать. Тут всё строго, как в армии. ОДНОСТОРОННИЙ поток, ёб твою мать!

  1. Intent (Намерение): Пользователь тыкнул кнопку — это Intent.
  2. Model (Модель/Состояние): Этот Intent попадает в «редьюсер», который на его основе вычисляет НОВОЕ, неизменяемое состояние всего экрана.
  3. View (Вид): Получает это цельное состояние и просто тупо рисует его. Всё!

Никаких случайных изменений из разных мест. Одно состояние на весь экран. Отлаживать — сказка, потому что в любой момент можно посмотреть, в каком состоянии приложение было и как оно в это состояние пришло. Но писать это... овердохуища boilerplate-кода иногда.

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")
    }
}

Видишь? Intent пришёл -> редьюсер склепал новое состояние на основе старого.

Короче, суть отличий:

  • MVP: «Эй, View, сделай то-то!» Ручное управление.
  • MVVM: «У меня данные изменились.» Автоматическая привязка, реактивщина.
  • MVI: «Вот твой Intent. Вот новое священное Состояние. Молча рисуй.» Строгая дисциплина и односторонний поток.

Выбирай, что ближе по душе. Хочешь просто и под контроль — MVP. Хочешь магии и меньше рутины — MVVM. А если ты садомазохист, который любит, чтобы всё было предсказуемо до слёз — добро пожаловать в MVI, чувак.