Какие недостатки есть у чистой архитектуры
Что проверяют
Применяете ли вы Clean Architecture осознанно или по шаблону из статьи. Интервьюеру важно, чтобы вы видели цену слоёв и могли сказать, где их можно не строить. Следом обычно звучит: «А все use case в вашем проекте действительно нужны?»
Как отвечать
Назовите недостатки, которые реально ощущаются в Android-проекте:
- бойлерплейт: на одну фичу приходятся DTO, доменная и UI-модель, мапперы между ними, интерфейс репозитория с реализацией, модуль DI в Hilt или Koin. Новое поле превращается в правку пяти файлов;
- пустые use case:
GetUserUseCase, который лишь вызываетrepository.getUser(), добавляет класс, тест и уровень косвенности без пользы; - многомодульность: модули
:domain,:data,:featureусложняют Gradle, требуют convention plugins, и без аккуратной настройки сборка становится медленнее; - порог входа: новичку сложно понять, куда класть код, а споры «это логика домена или представления» съедают время ревью;
- чистый Kotlin в домене: доменный слой не знает про Android, поэтому
Context, строковые ресурсы иUriприходится оборачивать абстракциями; - преждевременные интерфейсы: под единственную реализацию «на будущее», которое не наступает.
Затем покажите, как с этим живут. В гайде Google по архитектуре приложений доменный слой прямо назван необязательным: use case заводят, когда логика переиспользуется в нескольких ViewModel или сложна сама по себе. Мапперы не нужны там, где модели совпадают. Небольшому приложению часто хватает слоёв UI и data с ViewModel и репозиториями.
Хорошо закончить своим примером: где слои окупились (замена источника данных без правки UI, тесты доменной логики без эмулятора), а где вы их упростили.
Где спотыкаются
Называют главным минусом производительность. Лишний вызов метода и маппинг объектов ничтожны по сравнению с сетью и отрисовкой.
Путают Clean Architecture с разбиением на модули. Слои бывают и в одном модуле, а модули сами по себе архитектуру чистой не делают.
Отвечают только «много кода». Ответ сильнее, когда вы называете условия, при которых этот код окупается.