Sobes.tech
Middle

Vorbește despre pattern-ul MVVM (Model-View-ViewModel).

sobes.tech AI

Răspuns de la AI

MVC (Model-View-Controller).

Componente Descriere Responsabilitate
Model Reprezintă datele și logica de afaceri a aplicației. Nu depinde de View sau ViewModel. Gestionarea datelor, reguli de afaceri, interacțiune cu serverul/baza de date.
View Interfața utilizatorului. Afișează datele și transmite acțiunile utilizatorului către ViewModel. Nu conține logică de procesare a datelor. Afișarea informațiilor, gestionarea evenimentelor utilizatorului (atingere, glisare etc.).
ViewModel Intermediar între Model și View. Oferă View-ului date într-un format potrivit pentru afișare și procesează acțiunile utilizatorului, interacționând cu Modelul. Nu știe dacă View-ul este utilizat sau nu, comunică doar prin data binding. Transformarea datelor din Model pentru View, gestionarea interacțiunilor utilizatorului, logica de afaceri nelegată de UI.

Principii de bază:

  • Data Binding: Legarea datelor între View și ViewModel. Când datele din ViewModel se schimbă, View-ul se actualizează automat și viceversa.
  • Testabilitate: ViewModel-ul este ușor de testat deoarece nu depinde de framework-ul UI.
  • Separarea responsabilităților: Diviziune clară a rolurilor componentelor.

Avantaje:

  • Testare îmbunătățită.
  • Separare mai curată a responsabilităților.
  • Simplificarea bazei de cod în cazul UI-urilor complexe.

Dezavantaje:

  • Poate fi excesiv pentru aplicații simple.
  • Complexitate în implementarea Data Binding fără framework-uri externe (de exemplu, RxSwift, Combine).

Exemplu de structură:

// 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) ani"
    }

    // Metodă pentru gestionarea acțiunilor utilizatorului
    func userTapped() {
        print("Utilizatorul \(user.name) a fost apăsat")
        // Poate interacționa cu Modelul sau altă logică
    }
}

// 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() {
        // Legare de date (exemplu de legare manuală)
        nameLabel.text = viewModel.displayName
        ageLabel.text = viewModel.displayAge
    }

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