Sobes.tech
Junior

Čo sú MV vzory?

sobes.tech AI

Odpoveď od AI

Vzory MV (Model-View-ViewModel, Model-View-Presenter, Model-View-Controller) sú architektonické vzory, ktoré rozdeľujú zobrazenie (View), obchodnú logiku (Model) a logiku zobrazenia (ViewModel/Presenter). Cieľom je zlepšiť udržiavateľnosť, testovateľnosť a škálovateľnosť aplikácie prostredníctvom rozdelenia zodpovedností.

MVC (Model-View-Controller)

  • Model: Predstavuje údaje a obchodnú logiku.
  • View: Zobrazuje údaje z Modelu.
  • Controller: Spracováva akcie používateľa, aktualizuje Model a vyberá View na zobrazenie.

V Androide View (aktivita/fragment) často spája funkcie View a Controller, čo sťažuje testovanie.

MVP (Model-View-Presenter)

  • Model: Predstavuje údaje a obchodnú logiku.
  • View: Pasívne rozhranie, zobrazujúce údaje odovzdané Presenterom a odovzdávajúce akcie používateľa.
  • Presenter: Obsahuje logiku zobrazenia, komunikuje s Modelom a aktualizuje View cez rozhranie.

Zabezpečuje lepšie rozdelenie medzi View a logikou, čím je Presenter ľahšie testovateľný.

// Príklad rozhrania View v MVP
interface UserProfileView {
    fun showLoading()
    fun hideLoading()
    fun displayUserInfo(user: User)
    fun showError(message: String)
}

// Príklad Presenter
class UserProfilePresenter(private val view: UserProfileView, private val repository: UserRepository) {
    fun loadUserProfile(userId: String) {
        view.showLoading()
        repository.getUser(userId) { user ->
            view.hideLoading()
            if (user != null) {
                view.displayUserInfo(user)
            } else {
                view.showError("Nepodarilo sa načítať používateľa")
            }
        }
    }
}

MVVM (Model-View-ViewModel)

  • Model: Predstavuje údaje a obchodnú logiku. Používa Observable na oznámenie zmien.
  • View: Zobrazuje údaje z ViewModel a odosiela akcie používateľa do neho. Používa databinding na prepojenie View a ViewModel.
  • ViewModel: Poskytuje údaje pre View v vhodnom formáte, obsahuje logiku zobrazenia. Nemá priame prístup k View.

Používa mechanizmy pozorovateľov (LiveData, Flow) a databinding na automatickú aktualizáciu View pri zmene dát vo ViewModel. Robí ViewModel úplne nezávislým od Android frameworku a ľahko testovateľným.

// Príklad ViewModel s LiveData
class UserProfileViewModel(private val repository: UserRepository) : ViewModel() {
    private val _user = MutableLiveData<User?>()
    val user: LiveData<User?> = _user

    private val _loading = MutableLiveData<Boolean>()
    val loading: LiveData<Boolean> = _loading

    private val _error = MutableLiveData<String?>()
    val error: LiveData<String?> = _error

    fun loadUserProfile(userId: String) {
        _loading.value = true
        repository.getUser(userId) { user ->
            _loading.value = false
            if (user != null) {
                _user.value = user
                _error.value = null
            } else {
                _user.value = null
                _error.value = "Nepodarilo sa načítať používateľa"
            }
        }
    }
}

Porovnanie:

Model Vzťah medzi View a Logikou Testovateľnosť Logiky Závislosť Logiky od Androidu
MVC Tuhý (v Android View často je Controller) Priemerná Vysoká
MVP Voľný (cez rozhranie View) Vysoká Nízka (Presenter nie je závislý od Android UI)
MVVM Voľný (cez pozorovateľov a databinding) Vysoká Chýba (ViewModel nie je závislý od Android UI)

Výber vzoru závisí od požiadaviek projektu a preferencií tímu. MVVM s použitím komponentov Android Jetpack (ViewModel, LiveData, Data Binding) je odporúčaný prístup v modernej Android vývoji.