В чем разница между доменом и датой в чистой архитектуре
Что проверяют
Понимаете ли вы правило зависимостей: кто о ком знает и почему бизнес-логика не должна зависеть от Room и Retrofit. Типичный следующий вопрос: «Как домен получает данные, если он не знает про слой данных?», то есть проверка на инверсию зависимостей.
Как отвечать
«Дата» в вопросе означает data layer, слой данных. Разделение такое:
- domain: бизнес-сущности, сценарии (use case, interactor) и интерфейсы репозиториев. Это чистый Kotlin без Android SDK: ни
Context, ниLiveData, ни аннотаций Room. Часто выносится в отдельный Gradle-модуль без Android-плагина, чтобы случайная зависимость от платформы просто не собралась; - data: реализации репозиториев, источники данных (Retrofit, Room, DataStore), DTO и мапперы из DTO в доменные модели. Здесь решается, откуда брать данные: сеть, кеш или база, и как их синхронизировать.
Главное: зависимость направлена от data к domain. Домен объявляет interface UserRepository, data реализует его в UserRepositoryImpl, а DI (Hilt, Koin) подставляет реализацию. Поэтому use case тестируется обычным JUnit с фейковым репозиторием, а замена Retrofit на Ktor или Room на другое хранилище не трогает бизнес-правила.
Сильный ответ отметит расхождение с официальным гайдом Google. В рекомендуемой архитектуре Android слой domain необязателен и стоит между UI и data, а use case обращаются к репозиториям слоя data напрямую. Так проще, но строгой инверсии зависимостей там нет. Скажите, какой вариант вы выбирали и почему: небольшому приложению гайдового подхода обычно хватает.
Где спотыкаются
Используют сущности Room с @Entity или DTO с аннотациями сериализации как доменные модели. Тогда схема базы или формат API протекает в бизнес-логику и дальше в UI.
Пишут use case, который только вызывает один метод репозитория. Такой слой ничего не добавляет, и интервьюер спросит, зачем он нужен.
Путают направление и говорят, что domain зависит от data. В классической чистой архитектуре всё наоборот, и именно это позволяет тестировать домен без базы и сети.