Č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.