Sobes.tech
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()
    }
}