Sobes.tech
Middle+

Сиз MVVM архитектуралык жактан өз алдынча ишке ашырасызбы?

sobes.tech AI

AIден жооп

MVVM (Model-View-ViewModel) — бул архитектуралык үлгү, ал UI, көрүнүш логикасы жана бизнес логикасын бөлөт.

Негизги компоненттер:

  • Model: Маалыматтарды жана бизнес логиканы көрсөтөт. UI-дан көз каранды эмес.
  • View: UI катмар. ViewModelден маалыматтарды көрсөтөт жана колдонуучунун аракеттерин (чекиттер) ViewModelге жиберет. Бизнес логикасын камтыбайт.
  • ViewModel: Көрсөтүүнүн логикасын камтыйт, Modelден алынган маалыматтарды көрсөтүү үчүн даярдайт жана колдонуучунун аракеттерин иштетет. View менен түздөн-түз байланышы жок, байкоо жүргүзүлүүчү маалыматтар (Observable streams) аркылуу иштейт.

Өзүнчө ишке ашыруу:

  1. Model түзүү: Жөнөкөй Plain Old Java Objects (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 көзөмөлү менен) алынган. 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) — ViewModelге көзкаранды болгон компоненттерди берүү үчүн.
  • Асинхрон операцияларды иштетүү — корутиндер же башка механизмдер аркылуу.

Артыкчылыктары:

  • Тестирлөө оңой: ViewModel UIдан көз каранды эмес тестирленет.
  • Жауапкерликти бөлүү: UI, көрүнүш логикасы жана бизнес логикасы так бөлүнгөн.
  • Конфигурация өзгөрүүлөрүнө туруштук берүү: ViewModel экранды бурууда жана башка өзгөрүүлөрдө сакталат.
  • Кодду оңой тейлөө.