Middle
Parlami del pattern MVVM (Model-View-ViewModel).
sobes.tech AI
Risposta dell'AI
MVC (Model-View-Controller).
| Componente | Descrizione | Responsabilità |
|---|---|---|
| Model | Rappresenta i dati e la logica di business dell'applicazione. Non dipende da View o ViewModel. | Gestione dei dati, regole di business, interazione con server/database. |
| View | Interfaccia utente. Mostra i dati e trasmette le azioni dell'utente al ViewModel. Non contiene logica di elaborazione dei dati. | Visualizzazione delle informazioni, gestione degli eventi utente (tocchi, swipe, ecc.). |
| ViewModel | Mediatore tra Model e View. Fornisce alla View dati in un formato adatto alla visualizzazione e gestisce le azioni dell'utente, interagendo con il Model. Non sa se la View è in uso o meno, comunica solo tramite data binding. | Trasformare i dati dal Model per la View, gestire le interazioni utente, logica di business non legata all'UI. |
Principi fondamentali:
- Data Binding: Binding dei dati tra View e ViewModel. Quando i dati nel ViewModel cambiano, la View si aggiorna automaticamente, e viceversa.
- Testabilità: Il ViewModel è facile da testare, poiché non dipende dal framework UI.
- Separazione delle responsabilità: Chiarezza nei ruoli dei componenti.
Vantaggi:
- Migliore testabilità.
- Separazione più pulita delle responsabilità.
- Semplificazione del codice in presenza di UI complesse.
Svantaggi:
- Potrebbe essere eccessivo per applicazioni semplici.
- Complessità nell'implementare il Data Binding senza framework esterni (ad esempio, RxSwift, Combine).
Esempio di struttura:
// Modello
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) anni"
}
// Metodo per gestire le azioni dell'utente
func userTapped() {
print("Utente \(user.name) cliccato")
// Potrebbe interagire con il Model o altra logica
}
}
// Vista (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 (esempio di binding manuale)
nameLabel.text = viewModel.displayName
ageLabel.text = viewModel.displayAge
}
@IBAction func tapGestureRecognized(_ sender: Any) {
viewModel.userTapped()
}
}