Ответ
Разделяй на слои:
- Domain - бизнес-логика и use case (Interactor)
class FetchDataUseCase(private val repo: DataRepository) {
suspend operator fun invoke(): Result<Data> = repo.fetchData()
}
- Data - репозиторий (абстракция) + реализация (DataSource)
interface DataRepository {
suspend fun fetchData(): Result<Data>
}
class RemoteDataSource(private val api: ApiService) : DataRepository {
override suspend fun fetchData() = try {
Result.success(api.getData())
} catch (e: Exception) {
Result.failure(e)
}
}
- Presentation - ViewModel вызывает use case, обрабатывает состояния (Loading/Success/Error)
Ключевые моменты:
- Слои зависят только внутрь (Domain → Data, Presentation → Domain)
- UseCase не знает о деталях реализации (сеть, БД)
- Репозиторий скрывает источник данных (сеть/кэш)