Sobes.tech
Junior

MVVM ნიმუშის შესახებ მითხარი.

sobes.tech AI

პასუხი AI-სგან

მოდელი-ხედი-მოდელი ხედვა (MVVM) — არქიტექტურული ნიმუში, რომელიც გამოყოფს მომხმარებლის ინტერფეისს (View) ბიზნეს-ლოგიკიდან (Model) შუამავლით — ხედი მოდელი (ViewModel).

  • Model: წარმოადგენს მონაცემებს და აპლიკაციის ბიზნეს-ლოგიკას. არ შეიცავს UI-სპეციფიკურ ლოგიკას.
  • View: აჩვენებს ViewModel-დან მონაცემებს და აგზავნის მომხმარებლის მოქმედებებს (მაგალითად, ღილაკების დაჭერას) ViewModel-თან. არ შეიცავს ბიზნეს-ლოგიკას, მხოლოდ გამოსახულების ლოგიკას.
  • ViewModel: მოქმედებს როგორც კავშირი. უზრუნველყოფს მონაცემებს Model-დან View-ისთვის მოსახერხებელ ფორმატში და პროცესებს View-დან მოთხოვნებს, განაახლებს Model-ს. შეიცავს გამოსახულების ლოგიკას, მაგრამ პირდაპირ არ მართავს View-ს. ხშირად იყენებს LiveData ან StateFlow რეაქტიული განახლებებისთვის.

უპირატესობები:

  • პასუხისმგებლობის განყოფილება: აუმჯობესებს კოდის წაკითხვას და შენარჩუნებას.
  • ტესტირებადობა: ViewModel-ს ადვილია ტესტირება იზოლირებულად, რადგან ის არ არის დამოკიდებული Android API-ზე.
  • ცვლილებების მხარდაჭერა: ViewModel გადარჩება კონფიგურაციის ცვლილებების დროს (მაგალითად, ეკრანის მორბენალი) და ავიცილებს მონაცემების განმეორებით მიღებას.
  • მოდულურობის გაუმჯობესება.

მაგალითური სტრუქტურა:

// მოდელი (რეპოზიტორი მაგალითისთვის)
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 და სხვა UI ელემენტების განახლების ლოგიკა
    }
}