Sobes.tech
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()
    }
}