Какие плюсы и минусы MVI

Ответ

Плюсы MVI:
✔️ Однозначное состояние (Single Source of Truth)
✔️ Предсказуемость (все изменения через интенты)
✔️ Легко тестировать (чистые функции)
✔️ Хорошая масштабируемость
✔️ Нет дублирования состояний

Минусы MVI:
❌ Больше бойлерплейта (много классов)
❌ Крутая кривая обучения
❌ Избыточность для простых экранов
❌ Сложность с side-эффектами

Пример:

// State
data class LoginState(val isLoading: Boolean, val error: String?)

// Intent
sealed class LoginIntent {
    object Submit : LoginIntent()
    data class Error(val message: String) : LoginIntent()
}

Ответ 18+ 🔞

Э, слушай, а вот это MVI, ну реально, как хитрая жопа — с одной стороны красиво, а с другой подвох есть. Ну типа, плюсы-то вроде огонь, ёпта.

Однозначное состояние, это да, святое дело. Один источник правды, как в хорошем баре — один бармен, и он всегда знает, кто сколько должен. Никаких "ой, а я думал кнопка в другом ViewModel'е". Предсказуемость — тоже ништяк. Все изменения только через эти самые интенты, как через турникет в метро. Хочешь состояние поменять — купи билет, сука, в виде интента. Легко тестировать, потому что всё на чистых функциях, тут и спорить нечего. Масштабируется хорошо, когда проект раздувается до овердохуища компонентов — это спасение.

Но вот минусы, бля... Ну ёперный театр. Бойлерплейта — просто пиздец. Столько классов надо нарисовать на один ебучий экран логина, что волнение ебать. State, Intent, Action, ещё чёрт в ступе ногу сломит. Кривая обучения — не то что крутая, а хуй с горы, сразу в пропасть. Нового человека подсаживаешь, он смотрит на это и просто сам от себя охуевает. Для простых экранов — это как из пушки по воробьям, ну чисто мартышлюшка какая-то. И side-эффекты... Вот с ними всегда головняк, как их правильно впихнуть, чтобы не получилась пиздопроебибна архитектура.

Ну и пример, смотри, вроде логично, но чувствую подозрение ебать — не слишком ли много всего для одной кнопки "Войти"?

// State
data class LoginState(val isLoading: Boolean, val error: String?)

// Intent
sealed class LoginIntent {
    object Submit : LoginIntent()
    data class Error(val message: String) : LoginIntent()
}

В общем, инструмент мощный, но браться за него нужно, когда уже реально понимаешь, зачем. А то можно так накрутить, что потом сам будешь ебать копать, пытаясь разобраться, куда тут новый чих засунуть.