Этот вопрос проверяет умение объяснить взаимодействие слоёв Clean Architecture при сетевом доступе.
Получение данных начинается с вызова use case в domain-слое, который обращается к репозиторию. Репозиторий использует data sources для выполнения сетевых запросов, преобразует DTO в доменные модели и передаёт результат обратно. Presentation-слой получает готовые данные, не зная деталей сети. Такой подход обеспечивает максимальную изоляцию и гибкость.
Clean Architecture помогает отделить сетевую реализацию от бизнес-логики и UI.
Например, ViewModel вызывает:
val result = getUserUseCase(id)
ViewModel не знает:
какой HTTP-клиент используется
где находится API
как устроены DTO
Она работает только с доменными моделями.
Use case реализует бизнес-логику:
определяет сценарии загрузки
выбирает, что делать при ошибках
работает с доменными сущностями
Пример:
class GetUserUseCase(private val repo: UserRepository) {
suspend operator fun invoke(id: String) = repo.getUser(id)
}
Репозиторий — единственная точка, которая знает о реальных источниках данных:
RemoteDataSource делает HTTP-запросы
LocalDataSource читает/пишет в базу
Repository решает, как объединять данные
Например:
сначала проверить кэш
затем запросить API
сохранить в базу
Обычно это Retrofit/Ktor:
interface ApiService {
@GET("user/{id}")
suspend fun getUser(@Path("id") id: String): UserDto
}
DataSource получает DTO — модель, описывающую структуру ответа сервера.
Репозиторий преобразует ответ сервера:
fun UserDto.toDomain() = User(name, age)
Это защищает доменную модель от изменений API.
Путь данных выглядит так:
Network → DTO → Repository → Domain Model → Use Case → ViewModel → UI
Clean Architecture изолирует сетевой слой, обеспечивая гибкость, тестируемость и устойчивость к изменениям API. Каждый слой выполняет строго определённую роль и не знает о деталях соседних слоёв.