Middle
Vertel me over het MVVM-patroon (Model-View-ViewModel).
sobes.tech AI
Antwoord van AI
MVC (Model-View-Controller).
| Component | Beschrijving | Verantwoordelijkheid |
|---|---|---|
| Model | Vertegenwoordigt de gegevens en de bedrijfslogica van de applicatie. Afhankelijk van View of ViewModel niet. | Gegevensbeheer, bedrijfsregels, interactie met server/database. |
| View | Gebruikersinterface. Toont gegevens en geeft gebruikersacties door aan de ViewModel. Bevat geen verwerkingslogica voor gegevens. | Weergave van informatie, beheer van gebruikersgebeurtenissen (tappen, vegen, etc.). |
| ViewModel | Tussenpersoon tussen Model en View. Biedt de View gegevens in een geschikt formaat en verwerkt gebruikersacties door interactie met het Model. Weet niet of de View wordt gebruikt of niet, communiceert alleen via data binding. | Gegevens van het Model omzetten voor de View, gebruikersinteracties verwerken, niet-UI bedrijfslogica. |
Basisprincipes:
- Data Binding: Data binding tussen View en ViewModel. Wanneer gegevens in ViewModel veranderen, wordt de View automatisch bijgewerkt, en vice versa.
- Testbaarheid: ViewModel is gemakkelijk te testen omdat het niet afhankelijk is van het UI-framework.
- Scheiding van verantwoordelijkheden: Duidelijke rolverdeling van componenten.
Voordelen:
- Verbeterde testbaarheid.
- Schoner scheiding van verantwoordelijkheden.
- Vereenvoudiging van de codebasis bij werken met complexe UI.
Nadelen:
- Kan overbodig zijn voor eenvoudige applicaties.
- Complexiteit bij het implementeren van Data Binding zonder externe frameworks (bijvoorbeeld RxSwift, Combine).
Voorbeeldstructuur:
// 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) jaar"
}
// Methode voor het verwerken van gebruikersacties
func userTapped() {
print("Gebruiker \(user.name) is getapt")
// Mogelijk interactie met Model of andere logica
}
}
// 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 (voorbeeld handmatige binding)
nameLabel.text = viewModel.displayName
ageLabel.text = viewModel.displayAge
}
@IBAction func tapGestureRecognized(_ sender: Any) {
viewModel.userTapped()
}
}