Junior
Porozprávaj o vzorec MVVM.
sobes.tech AI
Odpoveď od AI
Model-View-ViewModel (MVVM) je architektonický vzor, ktorý oddeluje používateľské rozhranie (View) od podnikovej logiky (Model) pomocou sprostredkovateľa - Modelu pohľadu (ViewModel).
- Model: Predstavuje údaje a podnikateľskú logiku aplikácie. Neobsahuje žiadnu UI špecifickú logiku.
- View: Zobrazuje údaje z ViewModel a odosiela akcie používateľa (napríklad stlačenia tlačidiel) do ViewModel. Neobsahuje podnikateľskú logiku, iba logiku zobrazenia.
- ViewModel: Pôsobí ako spojovací článok. Poskytuje údaje z Modelu pre View v vhodnom formáte na zobrazenie a spracováva požiadavky od View, aktualizujúc Model. Obsahuje logiku zobrazenia, ale priamo nemanipuluje s View. Často používa LiveData alebo StateFlow na reaktívne aktualizácie View.
Výhody:
- Oddelenie zodpovednosti: Zlepšuje čitateľnosť a udržiavateľnosť kódu.
- Testovateľnosť: ViewModel je ľahko testovateľná v izolácii, pretože nezávisí od Android API.
- Podpora životaschopnosti: ViewModel prežije zmeny konfigurácie (napríklad otočenie obrazovky) a vyhýba sa opätovnému získavaniu údajov.
- Vylepšená modularita.
Príklad štruktúry:
// Model (repozitár pre príklad)
class UserRepository {
fun getUsers(): List<User> {
// ... logika získavania používateľov ...
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() // Použitie delegáta od Android KTX
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewModel.users.observe(viewLifecycleOwner) { userList ->
// Aktualizácia UI (napríklad adaptéra RecyclerView)
updateUI(userList)
}
}
private fun updateUI(userList: List<User>) {
// Logika aktualizácie TextView, RecyclerView a pod.
}
}