Middle
MVVM (Model-View-ViewModel) nümunəsi haqqında danış.
sobes.tech Süni İntellekt
AI-dan cavab
MVC (Model-Görünüm-Kontrol).
| Komponent | Təsviri | Məsuliyyət |
|---|---|---|
| Model | Tətbiqin məlumatlarını və biznes məntiqini təmsil edir. View və ya ViewModel-dən asılı deyil. | Məlumatların idarə olunması, biznes qaydaları, server/baza ilə əlaqə. |
| View | İstifadəçi interfeysi. Məlumatları göstərir və istifadəçi hərəkətlərini ViewModel-ə ötürür. Məlumatların işlənməsi məntiqini ehtiva etmir. | Məlumatların göstərilməsi, istifadəçi hadisələrinin idarə olunması (dokunma, sürüşdürmə və s.). |
| ViewModel | Model və View arasında vasitəçi. View üçün məlumatları uyğun formata təqdim edir və istifadəçi hərəkətlərini işləyir, Model ilə əlaqə qurur. View-in istifadə olunub-olunmadığını bilmir, yalnız data binding vasitəsilə əlaqə saxlayır. | Model-dən məlumatların View üçün çevrilməsi, istifadəçi qarşılıqlı əlaqələrinin idarə olunması, UI ilə əlaqəli olmayan biznes məntiqi. |
Əsas prinsiplər:
- Data Binding: View və ViewModel arasında məlumatların bağlanması. ViewModel-dəki məlumatlar dəyişdikdə, View avtomatik yenilənir və əksinə.
- Test ediləbilərlik: ViewModel UI çərçivəsindən asılı olmadığı üçün asan test edilə bilər.
- Məsuliyyətlərin ayrılması: Komponentlərin rollarının aydın bölünməsi.
Üstünlüklər:
- Test ediləbilənliyin yaxşılaşdırılması.
- Daha təmiz məsuliyyət bölünməsi.
- Çətin UI ilə işləyərkən kod bazasının sadələşdirilməsi.
Çatışmazlıqlar:
- Sadə tətbiqlər üçün artıq ola bilər.
- Xarici çərçivələr olmadan Data Binding-in həyata keçirilməsi çətin ola bilər (məsələn, RxSwift, Combine).
Struktur nümunəsi:
// 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) yaş"
}
// İstifadəçi hərəkətlərini işləyən metod
func userTapped() {
print("İstifadəçi \(user.name) basıldı")
// Model və ya digər məntiq ilə əlaqə qura bilər
}
}
// 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 (nümunə əl ilə bağlama)
nameLabel.text = viewModel.displayName
ageLabel.text = viewModel.displayAge
}
@IBAction func tapGestureRecognized(_ sender: Any) {
viewModel.userTapped()
}
}