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