Как реализуется чистая архитектура в приложениях и существуют ли для этого библиотеки
Что проверяют
Отличаете ли вы саму идею, направление зависимостей внутрь к бизнес-логике, от набора модных библиотек. Вторая часть вопроса с подвохом: библиотеки «для чистой архитектуры» как таковой нет, и следом обычно спрашивают, где у вас лежат интерфейсы репозиториев.
Как отвечать
Начните с правила зависимостей: внешние слои знают о внутренних, внутренние не знают ничего о внешних. В Android это обычно три слоя:
- presentation:
Activity,Fragmentили Compose-экраны иViewModel, которая держит состояние вStateFlow; - domain: use case и модели, чистый Kotlin без импортов
android.*. Здесь же объявлены интерфейсы репозиториев; - data: реализации репозиториев, Room, Retrofit, DataStore, мапперы из DTO в доменные модели.
Реализуют это многомодульностью: :domain как чистый Kotlin/JVM модуль, :data и :feature-* зависят от него. Тогда нарушение границы ловит компилятор, а не код-ревью.
На вопрос о библиотеках честный ответ такой: они обслуживают слои, а не архитектуру. Hilt или Koin связывают реализации с интерфейсами, корутины и Flow дают асинхронность без привязки к Android, Room и Retrofit живут в data. Готового фреймворка «Clean Architecture» нет, и это нормально.
Полезно упомянуть официальный гайд Google по архитектуре приложений: там UI layer, data layer и необязательный domain layer, причём use case зависят от репозиториев слоя data. У Мартина наоборот: data реализует интерфейсы, объявленные в domain. Скажите, какой вариант выбираете и почему.
Где спотыкаются
Делают use case на каждый вызов репозитория. GetUserUseCase, который просто проксирует repository.getUser(), добавляет файл и ничего не даёт. Use case нужен там, где есть логика или комбинация нескольких источников.
Перечисляют Dagger, Room и Retrofit как ответ на «как реализуется». Это инструменты, а про направление зависимостей и границы модулей не звучит ни слова.
Протаскивают DTO из Retrofit или @Entity из Room прямо во ViewModel. Тогда изменение ответа сервера ломает экран, и слой data только называется отдельным.