Sobes.tech
Middle+

MVVM memarlıq yanaşmasını özünüz necə həyata keçirərdiniz?

sobes.tech Süni İntellekt

AI-dan cavab

MVVM (Model-View-ViewModel) memarlıq şablonudur və UI, təqdimat məntiqi və biznes məntiqini ayırır.

Əsas komponentlər:

  • Model: Məlumatları və biznes məntiqini təmsil edir. UI-dən asılı deyil.
  • View: UI qatıdır. ViewModel-dən məlumatları göstərir və istifadəçi hərəkətlərini (hadisələr) ViewModel-ə göndərir. Biznes məntiqini ehtiva etmir.
  • ViewModel: Təqdimat məntiqini ehtiva edir, Model-dən məlumatları hazırlayır və View-də göstərmək üçün işləyir və istifadəçi hərəkətlərini emal edir. Birbaşa View-ə istinad etmir, müşahidə olunan məlumatlar (Observable streams) vasitəsilə qarşılıqlı əlaqə qurur.

Müstəqil həyata keçirmə:

  1. Model yaradılması: Sadə Java POJO və ya Kotlin data sinifləri məlumatların təmsilatı üçün, məlumat mənbələrinə giriş üçün repositorylər (şəbəkə, verilənlər bazası).

    // Model nümunəsi
    data class User(val id: Int, val name: String, val email: String)
    
    class UserRepository {
        fun getUser(userId: Int): User {
            // Məlumat mənbəsindən istifadəçini alma məntiqi
            return User(userId, "Test User $userId", "test$userId@example.com")
        }
    }
    
  2. ViewModel yaradılması: ViewModel-dən irs alan sinif (Android Architecture Components-dan və ya öz həyat dövrü ilə əlaqəli həyata keçirmə). LiveData və ya Kotlin StateFlow/SharedFlow saxlayır. İstifadəçi hərəkətlərini emal etmək və məlumatları yeniləmək üçün metodlar ehtiva edir.

    // ViewModel nümunəsi
    class UserViewModel(private val userRepository: UserRepository) : androidx.lifecycle.ViewModel() {
    
        private val _user = MutableLiveData<User>()
        val user: LiveData<User> = _user
    
        fun loadUser(userId: Int) {
            // Əsl tətbiqdə - asinxron yükləmə
            val loadedUser = userRepository.getUser(userId)
            _user.value = loadedUser // LiveData-ni yeniləmək
        }
    
        fun updateUser(newUser: User) {
            // İstifadəçini yeniləmək məntiqi
            _user.value = newUser
        }
    }
    
  3. View-in həyata keçirilməsi: Activity və ya Fragment. ViewModel ilə əlaqə qurur, ViewModel-dən müşahidə olunan məlumatlara abunə olur və məlumatlar dəyişdikdə UI-ni yeniləyir. İstifadəçi hadisələrini (kliklər, mətn daxil etmə) ViewModel-ə delegasiya edir. Data Binding və ya View Binding istifadə edir.

    // View (Fragment) nümunəsi
    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 əldə etmək, üstünlük verilir ViewModelProvider vasitəsilə
            viewModel = ViewModelProvider(this).get(UserViewModel::class.java)
    
            // Müşahidə olunan məlumatlara abunəlik
            viewModel.user.observe(viewLifecycleOwner) { user ->
                // UI-ni yeniləmək
                binding.userNameTextView.text = user.name
                binding.userEmailTextView.text = user.email
            }
    
            // Hadisəni ViewModel-ə delegasiya etmək
            binding.loadUserButton.setOnClickListener {
                viewModel.loadUser(1) // Nümunə: ID 1 olan istifadəçini yükləmək
            }
        }
    
        override fun onDestroyView() {
            super.onDestroyView()
            _binding = null
        }
    }
    
  4. Komponentlərin əlaqələndirilməsi: View ViewModel-in nümunəsini yaradır ( ViewModelProvider vasitəsilə) və müşahidə olunan məlumatlara abunə olur. ViewModel Model ilə işləyir.

Əsas aspektlər:

  • LiveData və ya Flow istifadə edərək reaktivlik və məlumatlar dəyişdikdə UI-nin avtomatik yenilənməsi.
  • ViewModelProvider istifadə edərək ViewModel-in düzgün həyat dövrünün təmin edilməsi.
  • Dependency Injection (məsələn, Hilt və ya Koin) istifadə edərək asılılıqları təmin etmək (məsələn, UserRepository) ViewModel-ə.
  • Asinxron əməliyyatların (şəbəkə sorğuları, verilənlər bazası ilə işləmək) ViewModel-də coroutine və ya digər mexanizmlərlə idarə olunması.

Bu yanaşmanın üstünlükləri:

  • Test ediləbilərlik: ViewModel-i UI-dan asılı olmayaraq asanlıqla test etmək olar.
  • Məsuliyyətlərin bölünməsi: UI, təqdimat məntiqi və biznes məntiqi arasında aydın bölünmə.
  • Konfiqurasiya dəyişikliklərinə davamlılıq: ViewModel ekranın döndürülməsi və digər konfiqurasiya dəyişikliklərində saxlanılır.
  • Kodun saxlanmasının yaxşılaşdırılması.