Архитектура Android приложения. Слои, назначения, примеры использования v2
Архитектура Android приложения, основанная на принципах Clean Architecture или подобных им, обычно состоит из трех основных слоев: domain
, data
и ui
. Каждый слой имеет свою ответственность и содержит определенные компоненты приложения.
// Модель данных (domain/entity)
data class User(val id: Int, val name: String, val email: String)
// Интерфейс репозитория (domain/repository)
interface UserRepository {
suspend fun getUserById(userId: Int): User
}
// Интерактор (domain/usecase)
class GetUserByIdUseCase(private val userRepository: UserRepository) {
suspend operator fun invoke(userId: Int): User {
return userRepository.getUserById(userId)
}
}
// Реализация репозитория (data/repository)
class UserRepositoryImpl(private val apiService: ApiService) : UserRepository {
override suspend fun getUserById(userId: Int): User {
return apiService.getUserById(userId)
}
}
// ViewModel (ui/viewmodel)
class UserViewModel(private val getUserByIdUseCase: GetUserByIdUseCase) : ViewModel() {
private val _user = MutableLiveData<User>()
val user: LiveData<User> = _user
fun fetchUser(userId: Int) {
viewModelScope.launch {
_user.value = getUserByIdUseCase(userId)
}
}
}
// Fragment (ui/view)
class UserDetailsFragment : Fragment() {
private val viewModel: UserViewModel by viewModels()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewModel.user.observe(viewLifecycleOwner, Observer { user ->
// Обновление пользовательского интерфейса с данными пользователя
})
viewModel.fetchUser(userId)
}
}
Такая архитектура позволяет разделить различные аспекты приложения и сделать его более модульным, легко тестируемым и поддающимся изменениям. Кроме того, она соблюдает принцип единственной ответственности (Single Responsibility Principle) и разделение интерфейсов (Interface Segregation Principle).