J'ai une application C++ conçue selon un Model-View-Controller pattern classique. Le modèle est modifié via une interface de contrôleur par une source externe au moyen d'un Command pattern. Les commandes sont représentées par un objet Action (et ses dérivés).Annuler la fonctionnalité dans une conception MVC
Maintenant, je veux être en mesure d'annuler les modifications, mais mon problème est que je n'ai pas de getters dans mon contrôleur, seulement des setters. Cela semble assez logique, car il n'y a aucune raison pour que quelqu'un puisse obtenir des informations sur le modèle via le contrôleur. Ainsi, je ne peux pas laisser mes objets Action stocker l'état du Modèle, puisqu'ils n'y ont pas accès.
Comment pourrait-on résoudre ce problème? Je voudrais garder mon application aussi extensible que possible et je ne suis pas tout à fait sûr quelle option est la meilleure pour cela. Les méthodes que j'utilise jusqu'ici sont les suivantes:
- Mettre en place des méthodes getter dans le contrôleur. Cela semble aller à l'encontre du modèle MVC.
- Donner à l'action un pointeur vers une vue. L'action peut alors:
- Utiliser des accesseurs individuels pour obtenir l'état d'éléments spécifiques du modèle à modifier.
- Utilisez une méthode Memento implémentée par le visualiseur.
Peut-être qu'il ya une meilleure façon de le faire? À l'heure actuelle, pour être la meilleure option semble être 2, sous-option 1 (avec la sous-option 2, je pourrais tout à fait stocker beaucoup plus d'état que nécessaire pour annuler une action).
Remarque: Je sais qu'il existe d'autres questions sur la façon d'implémenter une action d'annulation. Cependant, les seules réponses que j'ai trouvées ont donné des suggestions pour utiliser un pattern Command ou Memento. Je sais que c'est probablement le chemin à parcourir. Ce que je demande est de savoir comment l'intégrer aussi proprement que possible dans une conception MVC. Ce qui ne me plaît pas dans le motif Memento, c'est qu'il me force à stocker un état complet. Disons que mon modèle est une matrice 1000x1000 et que ma commande est ChangeOneValueAtLocation. Pour pouvoir annuler ses modifications, l'objet ChangeOneValueAtLocation n'a besoin que de stocker la valeur précédente de l'emplacement qu'il change, mais cela ne semble pas possible avec Memento. Plus mon modèle est grand, plus ce problème devient important.
[Edit 2] Un autre problème que j'ai avec Memento dans le cas particulier de cette application: pour chaque méthode d'un objet de commande peut exécuter sur le modèle, il y a une méthode qui fait exact opposé (ou peut facilement être cajolé à faites-le). C'est pourquoi je trouverais un gâchis d'avoir à stocker tout l'état, il ne devrait pas être nécessaire de retourner une seule commande est très simple, le seul problème est d'obtenir les données pour pouvoir le faire.
De plus, je n'ai pas besoin d'être capable d'annuler une commande spécifique, seulement la plus haute de ma pile d'historique.
J'ai décidé d'adopter cette approche, car elle me permet de transférer facilement des modèles et leur historique associé à des clients externes. Mettre l'histoire dans un contrôleur rendrait cela plus difficile. De plus, j'ai une seule classe frontale pour mon modèle, donc je ne pense pas que le problème d'annulation non-atomique '' sehe'' sera un problème. – Darhuuk