Sobes.tech
Middle

MVVM (Model-View-ViewModel) naqshini haqida gapir.

sobes.tech AI

AIdan javob

MVC (Model-View-Controller).

Komponent Tavsif Mas'uliyat
Model Dasturning ma'lumotlari va biznes mantiqini ifodalaydi. View yoki ViewModelga bog'liq emas. Ma'lumotlarni boshqarish, biznes qoidalari, server/baza bilan aloqa.
View Foydalanuvchi interfysiysi. Ma'lumotlarni ko'rsatadi va foydalanuvchi harakatlarini ViewModelga uzatadi. Ma'lumotlarni ishlash logikasini o'z ichiga olmaydi. Ma'lumotlarni ko'rsatish, foydalanuvchi voqealarini (teginishlar, surishlar va boshqalar) boshqarish.
ViewModel Model va View o'rtasidagi vositachi. View uchun ma'lumotlarni qulay formatda taqdim etadi va foydalanuvchi harakatlarini ishlov berib, Model bilan aloqa qiladi. View foydalanilayotgan yoki yo'qligini bilmaydi, faqat ma'lumot bog'lash orqali muloqot qiladi. Modeldan ma'lumotlarni View uchun o'zgartirish, foydalanuvchi bilan muloqotni boshqarish, UI bilan bog'liq bo'lmagan biznes mantiq.

Asosiy tamoyillar:

  • Data Binding: View va ViewModel o'rtasida ma'lumotlarni bog'lash. ViewModeldagi ma'lumotlar o'zgarganda, View avtomatik ravishda yangilanadi va aksincha.
  • Testability: ViewModel UI-ramkaga bog'liq emasligi uchun oson test qilinadi.
  • Vazifalarni ajratish: Komponentlarning rollarining aniq ajralishi.

Afzalliklari:

  • Test qilish imkoniyatining yaxshilanishi.
  • Mas'uliyatlarning toza bo'linishi.
  • Murakkab UI bilan ishlashda kod bazasini soddalashtirish.

Kamchiliklari:

  • Oddiy ilovalar uchun ortiqcha bo'lishi mumkin.
  • Tashqi kutubxonalar (masalan, RxSwift, Combine) bo'lmagan holda Data Bindingni amalga oshirish qiyin bo'lishi mumkin.

Struktura misoli:

// Model
struct User {
    let name: String
    let age: Int
}

// ViewModel
class UserViewModel {
    private let user: User

    init(user: User) {
        self.user = user
    }

    var displayName: String {
        return user.name
    }

    var displayAge: String {
        return "\(user.age) yosh"
    }

    // Foydalanuvchi harakatlarini ishlov berish uchun metod
    func userTapped() {
        print("Foydalanuvchi \(user.name) bosildi")
        // Model yoki boshqa mantiq bilan muloqot qilishi mumkin
    }
}

// View (UIViewController)
class UserViewController: UIViewController {

    private var viewModel: UserViewModel!

    @IBOutlet weak var nameLabel: UILabel!
    @IBOutlet weak var ageLabel: UILabel!

    func configure(with viewModel: UserViewModel) {
        self.viewModel = viewModel
        updateUI()
    }

    private func updateUI() {
        // Data Binding (qo'lda bog'lash misoli)
        nameLabel.text = viewModel.displayName
        ageLabel.text = viewModel.displayAge
    }

    @IBAction func tapGestureRecognized(_ sender: Any) {
        viewModel.userTapped()
    }
}