Назад к вопросам
Junior
67
questionbank

Расскажи о паттерне MVVM.

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Модель-Представление-Модель представления (MVVM) — архитектурный паттерн, отделяющий пользовательский интерфейс (View) от бизнес-логики (Model) с помощью посредника — Модели представления (ViewModel).

  • Model: Представляет данные и бизнес-логику приложения. Не содержит никакой UI-специфичной логики.
  • View: Отображает данные из ViewModel и отправляет действия пользователя (например, нажатия кнопок) в ViewModel. Не содержит бизнес-логики, только логику отображения.
  • ViewModel: Выступает связующим звеном. Предоставляет данные из Model для View в удобном для отображения формате и обрабатывает запросы от View, обновляя Model. Содержит логику представления, но не напрямую манипулирует View. Часто использует LiveData или StateFlow для реактивного обновления View.

Преимущества:

  • Разделение ответственности: Улучшает читаемость и сопровождаемость кода.
  • Тестируемость: ViewModel легко тестировать в изоляции, поскольку она не зависит от Android API.
  • Поддержка жизнеспособности: ViewModel переживает изменения конфигурации (например, поворот экрана) и избегает повторного получения данных.
  • Улучшенная модульность.

Пример структуры:

// Model (репозиторий для примера)
class UserRepository {
    fun getUsers(): List<User> {
        // ... логика получения пользователей ...
        return listOf(User("Alice"), User("Bob"))
    }
}

// ViewModel
class UserViewModel(private val repository: UserRepository) : ViewModel() {
    private val _users = MutableLiveData<List<User>>()
    val users: LiveData<List<User>> = _users

    init {
        loadUsers()
    }

    private fun loadUsers() {
        _users.value = repository.getUsers()
    }
}

// View (Fragment/Activity)
class UserFragment : Fragment() {
    private val viewModel: UserViewModel by viewModels() // Использование делегата от Android KTX

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        viewModel.users.observe(viewLifecycleOwner) { userList ->
            // Обновление UI (например, адаптера RecyclerView)
            updateUI(userList)
        }
    }

    private fun updateUI(userList: List<User>) {
        // Логика обновления TextView, RecyclerView и т.д.
    }
}