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()
}
}