Ответ
Мы использовали SOLID принципы, особенно Single Responsibility (каждый класс/модуль делает одну вещь) и Dependency Inversion (зависимости через интерфейсы).
Пример:
// Интерфейс для абстракции источника данных
interface UserRepository {
suspend fun getUser(id: String): User
}
// Реализация для работы с сетью (может быть заменена на локальную БД)
class NetworkUserRepository : UserRepository {
override suspend fun getUser(id: String) = apiService.getUser(id)
}
// ViewModel зависит от абстракции, а не от конкретной реализации
class UserViewModel(repo: UserRepository) : ViewModel() {
// ...
}
Также применяли Clean Architecture с четким разделением на слои (data, domain, presentation) и MVVM для UI-логики.