Sobes.tech
Middle+

Чӣ гуна шумо мустақилона муносибати меъмории MVVM-ро татбиқ мекунед?

sobes.tech AI

Ҷавоб аз AI

MVVM (Model-View-ViewModel) шаблони архитектура аст, ки UI, логикаи намоиш ва логикаи бизнесро ҷудо мекунад.

Компонентҳои асосӣ:

  • Model: Намояндаи маълумот ва логикаи бизнес. Аз UI мустақил аст.
  • View: қабати UI. Маълумотро аз ViewModel намоиш медиҳад ва амалҳои корбар (ҳодисаҳо) ба ViewModel мефиристад. Логикаи бизнесро дар бар намегирад.
  • ViewModel: Логикаи намоишро дорад, маълумотро аз Model барои намоиш дар View омода мекунад ва амалҳои корбарро коркард мекунад. Ба View мустақиман пайваст намешавад, тавассути маълумоти назоратшаванда (Observable streams) иртибот мекунад.

Иҷрои мустақил:

  1. Эҷоди Model: Objectҳои оддӣ POJO ё Kotlin data классҳо барои намояндагии маълумот, репозиториҳо барои дастрасӣ ба манбаъҳои маълумот (шабака, БД).

    // Намунаи Model
    data class User(val id: Int, val name: String, val email: String)
    
    class UserRepository {
        fun getUser(userId: Int): User {
            // Логикаи гирифтани корбар аз манбаъ
            return User(userId, "Test User $userId", "test$userId@example.com")
        }
    }
    
  2. Эҷоди ViewModel: Класс, ки аз ViewModel аз Android Architecture Components (ё реализацияи худ бо Lifecycle awareness) мерос мегирад. Маълумотҳои LiveData ё Kotlin StateFlow/SharedFlow-ро нигоҳ медорад. Методҳо барои коркарди амалҳои корбар ва навсозии маълумот дорад.

    // Намунаи ViewModel
    class UserViewModel(private val userRepository: UserRepository) : androidx.lifecycle.ViewModel() {
    
        private val _user = MutableLiveData<User>()
        val user: LiveData<User> = _user
    
        fun loadUser(userId: Int) {
            // Дар барномаи воқеӣ - боркунии асинхрон
            val loadedUser = userRepository.getUser(userId)
            _user.value = loadedUser // Навсозии LiveData
        }
    
        fun updateUser(newUser: User) {
            // Логикаи навсозии корбар
            _user.value = newUser
        }
    }
    
  3. Иҷрои View: Activity ё Fragment. Бо ViewModel пайваст мешавад, ба маълумоти назоратшаванда дар ViewModel обуна мешавад, UI-ро дар тағйирёбии маълумот навсозӣ мекунад. Ҳодисаҳои корбарро (кликҳо, ворид кардани матн) ба ViewModel месупорад. Data Binding ё View Binding-ро барои пайвастагии декларативӣ истифода мебарад.

    // Намунаи View (Fragment)
    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, беҳтар бо ViewModelProvider
            viewModel = ViewModelProvider(this).get(UserViewModel::class.java)
    
            // обуна ба маълумоти назоратшаванда
            viewModel.user.observe(viewLifecycleOwner) { user ->
                // навсозии UI дар тағйирёбии корбар
                binding.userNameTextView.text = user.name
                binding.userEmailTextView.text = user.email
            }
    
            // супоридани ҳодиса ба ViewModel
            binding.loadUserButton.setOnClickListener {
                viewModel.loadUser(1) // Мисол: боркунии корбар бо ID 1
            }
        }
    
        override fun onDestroyView() {
            super.onDestroyView()
            _binding = null
        }
    }
    
  4. Пайваст кардани компонентҳо: View як нусхаи ViewModel (аз ViewModelProvider) месозад ва ба маълумоти назоратшаванда обуна мешавад. ViewModel бо Model кор мекунад.

Аспектҳои асосии иҷрои мустақил:

  • Истифодаи LiveData ё Flow барои реактивӣ ва навсозии автоматии UI дар тағйирёбии маълумот.
  • Истифодаи ViewModelProvider барои таъмин кардани давраи дурустии ViewModel.
  • Истифодаи Dependency Injection (масалан, Hilt ё Koin) барои таъмин кардани вобастагиҳо (масалан, UserRepository) дар ViewModel.
  • Ҳалли амалиётҳои асинхронӣ (захираҳои шабакавӣ, кор бо базаи додаҳо) дар ViewModel бо истифода аз корутинҳо ё механизмҳои дигар.

Фоидаҳо:

  • Тестшаванда: ViewModel ба осонӣ тест карда мешавад, алоҳида аз UI.
  • Ҷудо кардани масъулиятҳо: Ҷудоии равшан байни UI, логикаи намоиш ва логикаи бизнес.
  • Мустаҳкамӣ дар тағйиротҳои конфигурация: ViewModel дар гардииши экран ва дигар тағйиротҳо нигоҳ дошта мешавад.
  • Беҳтар кардани нигоҳдории код.