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ə:
-
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") } } -
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ə).LiveDatavə ya KotlinStateFlow/SharedFlowsaxlayı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 } } -
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 } } -
Komponentlərin əlaqələndirilməsi: View ViewModel-in nümunəsini yaradır (
ViewModelProvidervasitəsilə) və müşahidə olunan məlumatlara abunə olur. ViewModel Model ilə işləyir.
Əsas aspektlər:
LiveDatavə ya Flow istifadə edərək reaktivlik və məlumatlar dəyişdikdə UI-nin avtomatik yenilənməsi.ViewModelProvideristifadə 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ı.