Какие преимущества дает разделение на модули и слои в проекте
Что проверяют
Отличаете ли вы деление ради структуры от деления ради конкретной выгоды, и знаете ли цену такого решения. Вопрос почти всегда ведёт к вашему проекту: как у вас нарезано, сколько модулей, сколько идёт сборка. Уточняющий вопрос обычно про минусы, и ответ «минусов нет» закрывает тему не в вашу пользу.
Как отвечать
Разделите два разных деления, их часто путают:
- слои:
data(источники, DTO, маппинг),domain(модели и сценарии, чистый Kotlin без Android SDK),presentation(ViewModel и Compose). Зависимости направлены внутрь,domainне знает про Retrofit и Room; - модули Gradle:
:app,:core:network,:core:database,:core:ui,:feature:*. Фича не зависит от другой фичи напрямую, общее уходит вcore; - сборка: Gradle перепроверяет и пересобирает только затронутые модули, независимые собираются параллельно, а выбор между
apiиimplementationопределяет, сколько соседей потянет за собой правка; - тесты:
domainпроверяется обычным JUnit на JVM, без Robolectric и эмулятора, и это самая ощутимая выгода в повседневной работе; - границы: модуль публикует интерфейсы, реализация прячется. Попытка залезть внутрь становится ошибкой компиляции, а не замечанием на ревью.
Про цену говорите честно: усложняется граф DI (Hilt, точки входа, отдельные компоненты), навигация между фичами идёт через общий api-модуль или абстракцию, общий код расползается по core, а десятки мелких модулей дают заметный оверхед конфигурации Gradle. Лечится конвенционными плагинами в build-logic и configuration cache. Хорошо назвать цифры своего проекта: сколько модулей и как изменилась инкрементальная сборка.
Где спотыкаются
Пересказывают список преимуществ из статьи и не могут привести ни одного примера из своего проекта. Интервьюер спрашивал про опыт, а не про определения.
Заводят модуль на каждый экран. Проект из сотни модулей конфигурируется дольше, чем собирался раньше, и выгода уходит в ноль.
Тащат в domain Android SDK, аннотации Retrofit и модели ответов сервера. Слой перестаёт быть независимым, и тестировать его без эмулятора уже нельзя.