Sobes.tech
Middle

Parlez-moi du modèle MVVM (Model-View-ViewModel).

sobes.tech IA

Réponse de l'IA

MVC (Modèle-Vue-Contrôleur).

Composant Description Responsabilité
Modèle Représente les données et la logique métier de l'application. Ne dépend pas de la Vue ou du ViewModel. Gestion des données, règles métier, interaction avec le serveur/base de données.
Vue Interface utilisateur. Affiche les données et transmet les actions de l'utilisateur au ViewModel. Ne contient pas de logique de traitement des données. Affichage des informations, gestion des événements utilisateur (touches, glissements, etc.).
ViewModel Intermédiaire entre le Modèle et la Vue. Fournit à la Vue des données dans un format adapté à l'affichage et traite les actions de l'utilisateur, en interagissant avec le Modèle. Ne sait pas si la Vue est utilisée ou non, communique uniquement via le data binding. Transformer les données du Modèle pour la Vue, gérer les interactions utilisateur, logique métier non liée à l'UI.

Principes fondamentaux:

  • Data Binding: Liaison des données entre la Vue et le ViewModel. Lorsqu'une donnée change dans le ViewModel, la Vue se met à jour automatiquement, et vice versa.
  • Testabilité: Le ViewModel est facile à tester car il ne dépend pas du framework UI.
  • Séparation des responsabilités: Division claire des rôles des composants.

Avantages:

  • Meilleure testabilité.
  • Séparation plus propre des responsabilités.
  • Simplification de la base de code lors de la gestion d'une UI complexe.

Inconvénients:

  • Peut être excessif pour des applications simples.
  • Complexité de la mise en œuvre du Data Binding sans frameworks tiers (par exemple, RxSwift, Combine).

Exemple de structure:

// Modèle
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) ans"
    }

    // Méthode pour gérer les actions de l'utilisateur
    func userTapped() {
        print("Utilisateur \(user.name) tapé")
        // Peut interagir avec le Modèle ou une autre logique
    }
}

// Vue (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 (exemple de liaison manuelle)
        nameLabel.text = viewModel.displayName
        ageLabel.text = viewModel.displayAge
    }

    @IBAction func tapGestureRecognized(_ sender: Any) {
        viewModel.userTapped()
    }
}