Sobes.tech
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.
    }
}