В чем разница декларативного и императивного подходов
Что проверяют
Понимаете ли вы разницу не на уровне определения из учебника, а на уровне того, как она меняет работу с интерфейсом в Android. Почти всегда следом спрашивают про Jetpack Compose: что такое рекомпозиция и где в декларативном UI живёт состояние.
Как отвечать
Начните с короткой формулировки: императивный код описывает шаги, как прийти к результату, декларативный описывает, каким результат должен быть, а шаги выполняет фреймворк. Дальше сразу на примере UI:
- императивный UI (View и XML): вы находите view через ViewBinding или
findViewByIdи вручную меняете её:textView.text = ...,button.isEnabled = false,progress.visibility = View.GONE. Каждое изменение состояния нужно не забыть отразить во всех затронутых view; - декларативный UI (Jetpack Compose):
@Composableфункция описывает экран как функцию от состояния. Состояние поменялось, Compose перезапускает затронутые функции (рекомпозиция) и сам обновляет дерево; - состояние: в Compose оно явное, через
remember { mutableStateOf(...) }илиStateFlowиз ViewModel сcollectAsStateWithLifecycle(). Отсюда однонаправленный поток данных: состояние идёт вниз, события вверх; - вне UI: цепочка
list.filter { }.map { }в Kotlin против циклаforс временным списком, запросы Room, Gradle Kotlin DSL.
Закончите компромиссом. Декларативный подход убирает целый класс багов «view показывает не то, что в данных», но прячет механику: нужно понимать, когда срабатывает рекомпозиция, зачем key, derivedStateOf и стабильные типы. Императивный даёт полный контроль, и он остаётся внутри Compose: рисование на Canvas, AndroidView для старых компонентов.
Где спотыкаются
Говорят, что декларативный код «работает без шагов». Шаги никуда не делись, их выполняет фреймворк, и производительность зависит от того, насколько вы ему помогаете.
Пишут в Compose императивно: держат ссылки на элементы, меняют их из колбэков, запускают побочные эффекты прямо в теле composable вместо LaunchedEffect.
Путают декларативность с функциональным стилем. map и filter декларативны по духу, но это не то же самое, что декларативный UI с управлением состоянием.