Что такое паттерн MVI в разработке?

«Что такое паттерн MVI в разработке?» — вопрос из категории Архитектура, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

MVI (Model-View-Intent) — это архитектурный паттерн для построения пользовательских интерфейсов, основанный на однонаправленном потоке данных и неизменяемом состоянии.

Ключевые компоненты:

  • Model (Состояние): Единственный, неизменяемый (immutable) источник истины, описывающий состояние всего UI.
  • View: Пассивно отображает текущее состояние и преобразует пользовательские действия в Intents.
  • Intent: Намерение или событие (например, нажатие кнопки), которое описывает, что хочет сделать пользователь.

Принцип работы (цикл):

  1. View отправляет Intent.
  2. Система (Reducer/Processor) обрабатывает Intent на основе текущего Model и создает новый Model.
  3. Новый Model передается во View для отрисовки.

Пример на Kotlin:

// 1. Состояние (Model)
data class MainState(val isLoading: Boolean = false, val items: List<String> = emptyList())

// 2. Намерения (Intents)
sealed class MainIntent {
    object LoadData : MainIntent()
    data class DataLoaded(val items: List<String>) : MainIntent()
}

// 3. Редуктор (Reducer)
fun reduce(state: MainState, intent: MainIntent): MainState = when (intent) {
    is MainIntent.LoadData -> state.copy(isLoading = true)
    is MainIntent.DataLoaded -> state.copy(isLoading = false, items = intent.items)
}

Преимущества:

  • Предсказуемость: Состояние иммутабельно и изменяется только в одном месте.
  • Тестируемость: Легко тестируются чистые функции-редукторы и изолированное состояние.
  • Декларативность: UI является функцией от состояния (UI = f(state)).

Недостатки:

  • Избыточность кода (boilerplate): Требуется описывать состояния, интенты и редьюсеры даже для простых экранов.
  • Сложность: Кривая обучения выше по сравнению с MVVM.