Стоит ли разделять модули с учетом Clean Architecture?
Что проверяют
Различаете ли вы слои архитектуры и модули сборки. Это разные вещи: слой это правило про направление зависимостей, модуль Gradle это единица компиляции. Смотрят, не режете ли вы проект по картинке из статьи, не понимая, чем за это платят.
Как отвечать
Начните с того, что ответ зависит от размера. На небольшом приложении хватает слоёв внутри одного модуля, разложенных по пакетам: правило «внешние слои знают про внутренние, но не наоборот» соблюдается и так, а модульность добавит только возни со сборкой.
Дальше объясните, по какой оси резать. Разделение строго по слоям даёт три модуля на весь проект, и правка любой фичи всё равно трогает все три, то есть выигрыша в скорости сборки нет. Практичнее резать по функциональности, а слои держать пакетами внутри каждой фичи:
:app
:core:data :core:ui :core:common
:feature:profile :feature:searchЧто при этом выигрывается на самом деле:
- параллельная и инкрементальная сборка: модуль без изменений не пересобирается;
- запрет на случайную зависимость: класс из модуля, не объявленного в зависимостях, компилятор просто не видит;
- модуль с бизнес-логикой без зависимости от платформы собирается быстрее и тестируется без эмулятора.
Скажите про api и implementation при объявлении зависимостей: implementation не протаскивает зависимость дальше по графу, и именно это удерживает границы. Фичи общаются между собой через интерфейсы в отдельном тонком модуле, а реализации связываются в модуле приложения, чтобы фичи не зависели друг от друга напрямую.
Где спотыкаются
Заводят десятки модулей на маленьком проекте. Настройка сборки начинает занимать больше времени, чем сама компиляция, а каждая новая фича требует правки нескольких файлов сборки.
Второе: делают общий модуль, куда складывают всё подряд. Он попадает в зависимости ко всем остальным, любая правка в нём пересобирает проект целиком, и польза от разделения исчезает.
Третье: объявляют доменный модуль чистым, а потом тащат туда аннотации внедрения зависимостей и классы из android.*. Проверять это надо не глазами на ревью, а правилом сборки, которое падает при запрещённой зависимости.