Middle
Erzählen Sie mir vom MVVM-Muster (Model-View-ViewModel).
sobes.tech KI
Antwort von AI
MVC (Model-View-Controller).
| Komponente | Beschreibung | Verantwortlichkeit |
|---|---|---|
| Model | Repräsentiert die Daten und die Geschäftslogik der Anwendung. Unabhängig von View oder ViewModel. | Datenverwaltung, Geschäftsregeln, Interaktion mit Server/Datenbank. |
| View | Benutzeroberfläche. Zeigt Daten an und übermittelt Benutzeraktionen an das ViewModel. Enthält keine Datenverarbeitungslogik. | Informationsanzeige, Ereignisbehandlung des Benutzers (Tipps, Wischgesten usw.). |
| ViewModel | Vermittler zwischen Model und View. Bietet der View Daten in einem für die Anzeige geeigneten Format und verarbeitet Benutzeraktionen, indem es mit dem Model interagiert. Kennt nicht, ob die View verwendet wird oder nicht, kommuniziert nur über Datenbindung. | Daten vom Model für die View umwandeln, Benutzerinteraktionen verarbeiten, geschäftslogik, die nicht mit der UI zusammenhängt. |
Grundprinzipien:
- Datenbindung: Datenbindung zwischen View und ViewModel. Wenn sich Daten im ViewModel ändern, aktualisiert sich die View automatisch, und umgekehrt.
- Testbarkeit: Das ViewModel ist leicht zu testen, da es nicht vom UI-Framework abhängt.
- Trennung der Verantwortlichkeiten: Klare Rollenaufteilung der Komponenten.
Vorteile:
- Verbesserte Testbarkeit.
- Sauberere Verantwortlichkeitsaufteilung.
- Vereinfachung des Code-Base bei komplexen UI.
Nachteile:
- Kann für einfache Anwendungen überflüssig sein.
- Komplexität bei der Implementierung der Datenbindung ohne externe Frameworks (z.B. RxSwift, Combine).
Beispielstruktur:
// 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) Jahre"
}
// Methode zur Verarbeitung von Benutzeraktionen
func userTapped() {
print("Benutzer \(user.name) wurde angetippt")
// Möglicherweise Interaktion mit dem Model oder anderer Logik
}
}
// 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() {
// Datenbindung (Beispiel für manuelle Bindung)
nameLabel.text = viewModel.displayName
ageLabel.text = viewModel.displayAge
}
@IBAction func tapGestureRecognized(_ sender: Any) {
viewModel.userTapped()
}
}