Sobes.tech
Middle+

Siz o'zingiz MVVM arxitektura yondashuvini qanday amalga oshirasiz?

sobes.tech AI

AIdan javob

MVVM (Model-View-ViewModel) — bu arxitektura shabloni bo'lib, UI, taqdimot mantiqi va biznes mantiqini ajratadi.

Asosiy komponentlar:

  • Model: Ma'lumotlar va biznes mantiqini ifodalaydi. UI ga bog'liq emas.
  • View: UI qatlami. ViewModel dan ma'lumotlarni ko'rsatadi va foydalanuvchi harakatlarini (hodisalar) ViewModel ga yuboradi. Biznes mantiqini o'z ichiga olmaydi.
  • ViewModel: Taqdimot mantiqini o'z ichiga oladi, Model dan ma'lumotlarni tayyorlaydi va foydalanuvchi harakatlarini qayta ishlaydi. To'g'ridan-to'g'ri View ga bog'liq emas, kuzatuvchi ma'lumotlar (Observable oqimlar) orqali o'zaro aloqada bo'ladi.

Mustaqil amalga oshirish:

  1. Model yaratish: Oddiy Java POJO yoki Kotlin data classlaridan iborat bo'lib, ma'lumotlarni ifodalaydi, ma'lumot manbalariga kirish uchun repositorylar (tarmoq, ma'lumotlar bazasi).

    // Model misoli
    data class User(val id: Int, val name: String, val email: String)
    
    class UserRepository {
        fun getUser(userId: Int): User {
            // Ma'lumot manbasidan foydalanuvchini olish mantiqi
            return User(userId, "Test User $userId", "test$userId@example.com")
        }
    }
    
  2. ViewModel yaratish: ViewModel dan meros oladigan klass (Android Architecture Components dan yoki o'zining Lifecycle awareness bilan). LiveData yoki Kotlin StateFlow/SharedFlow ni kuzatuvchi ma'lumotlar uchun saqlaydi. Foydalanuvchi harakatlarini qayta ishlash va ma'lumotlarni yangilash uchun metodlar mavjud.

    // ViewModel misoli
    class UserViewModel(private val userRepository: UserRepository) : androidx.lifecycle.ViewModel() {
    
        private val _user = MutableLiveData<User>()
        val user: LiveData<User> = _user
    
        fun loadUser(userId: Int) {
            // Haqiqiy ilovada - asinxron yuklash
            val loadedUser = userRepository.getUser(userId)
            _user.value = loadedUser // LiveData ni yangilash
        }
    
        fun updateUser(newUser: User) {
            // Foydalanuvchini yangilash mantiqi
            _user.value = newUser
        }
    }
    
  3. View ni amalga oshirish: Activity yoki Fragment. ViewModel bilan bog'lanadi, ViewModel dan kuzatiladigan ma'lumotlarga obuna bo'ladi, ma'lumotlar o'zgarganda UI ni yangilaydi. Foydalanuvchi hoditalarini (kliklar, matn kiritish) ViewModel ga delegatsiya qiladi. Data Binding yoki View Binding dan foydalanadi.

    // View (Fragment) misoli
    class UserFragment : Fragment() {
    
        private lateinit var viewModel: UserViewModel
        private var _binding: FragmentUserBinding? = null
        private val binding get() = _binding!!
    
        override fun onCreateView(
            inflater: LayoutInflater, container: ViewGroup?,
            savedInstanceState: Bundle?
        ): View {
            _binding = FragmentUserBinding.inflate(inflater, container, false)
            return binding.root
        }
    
        override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
            super.onViewCreated(view, savedInstanceState)
    
            // ViewModel ni olish, afzalroq ViewModelProvider orqali
            viewModel = ViewModelProvider(this).get(UserViewModel::class.java)
    
            // Kuzatuvchi ma'lumotlarga obuna bo'lish
            viewModel.user.observe(viewLifecycleOwner) { user ->
                // UI ni yangilash
                binding.userNameTextView.text = user.name
                binding.userEmailTextView.text = user.email
            }
    
            // Hoditani ViewModel ga delegatsiya qilish
            binding.loadUserButton.setOnClickListener {
                viewModel.loadUser(1) // Misol uchun: ID 1 bo'lgan foydalanuvchini yuklash
            }
        }
    
        override fun onDestroyView() {
            super.onDestroyView()
            _binding = null
        }
    }
    
  4. Komponentlarni bog'lash: View ViewModel ning nusxasini yaratadi ( ViewModelProvider orqali) va kuzatuvchi ma'lumotlarga obuna bo'ladi. ViewModel Model bilan ishlaydi.

Asosiy jihatlar:

  • LiveData yoki Flow dan foydalanish, reaktivlik va ma'lumotlar o'zgarganda UI ni avtomatik yangilash.
  • ViewModelProvider dan foydalanish, ViewModel ning to'g'ri hayot tsiklini ta'minlash.
  • Dependency Injection (masalan, Hilt yoki Koin) dan foydalanish, bog'liqliklarni ta'minlash (masalan, UserRepository) uchun.
  • Asinxron operatsiyalarni (tarmoq so'rovlar, ma'lumotlar bazasi bilan ishlash) ViewModel da coroutine yoki boshqa mexanizmlar bilan boshqarish.

Bunday yondashuvning afzalliklari:

  • Test qilish mumkinligi: ViewModel ni alohida test qilish oson.
  • Mas'uliyatlarni ajratish: UI, taqdimot mantiqi va biznes mantiqi o'rtasida aniq ajratish.
  • Konfiguratsiya o'zgarishlariga chidamlilik: ViewModel ekran burilishlari va boshqa konfiguratsiya o'zgarishlarida saqlanadi.
  • Kodning yaxshiroq qo'llab-quvvatlanishi.