Зачем нужны use cases в архитектуре
Что проверяют
Понимаете ли вы, зачем в Android-приложении доменный слой и когда он лишний. Речь о use case из Clean Architecture, а не о диаграммах вариантов использования UML. Следом обычно спрашивают, чем use case отличается от метода репозитория.
Как отвечать
Use case (интерактор) это класс с одной бизнес-операцией, который стоит между ViewModel и репозиториями. В руководстве Google по архитектуре приложений доменный слой отмечен как необязательный, и это стоит сказать сразу.
Зачем он нужен:
- переиспользование: одна и та же логика нужна нескольким экранам. Вместо копирования в две
ViewModelеё выносят, например, вGetLatestNewsWithAuthorsUseCase; - объединение источников: операция берёт данные из нескольких репозиториев, скажем новости и авторов, и склеивает их;
- разгрузка ViewModel: там остаётся состояние экрана, а бизнес-правила уходят в отдельный класс;
- тестируемость: use case пишется на чистом Kotlin без Android SDK и проверяется обычным JUnit с фейковыми репозиториями.
По соглашениям Google название складывается из глагола в настоящем времени, существительного и суффикса UseCase, а класс удобно вызывать как функцию через operator fun invoke. Use case не хранит изменяемого состояния, получает зависимости через конструктор (обычно через Hilt) и безопасен для вызова с главного потока: тяжёлую работу сам переносит на другой диспетчер через withContext.
Цена тоже понятная: на простом CRUD-экране use case вырождается в прокладку, которая только вызывает репозиторий и добавляет файлы без пользы.
Где спотыкаются
Отвечают про UML и сбор требований. Это другое понятие, и на Android-интервью такой ответ показывает, что вы не работали с многослойной архитектурой.
Заводят use case на каждый метод репозитория, потому что «так положено». Сильнее ответ, где вы называете условие: логика переиспользуется или объединяет несколько источников.
Тянут в use case Context, LiveData или другие классы Android. Доменный слой перестаёт быть чистым Kotlin, и его уже не проверить без эмулятора или Robolectric.