Je suis en train d'écrire un outil de modélisation structurelle pour une application de génie civil. J'ai une énorme classe de modèle représentant l'ensemble du bâtiment, qui comprend des collections de nœuds, d'éléments de ligne, de charges, etc. qui sont également des classes personnalisées.
J'ai déjà codé un moteur d'annulation qui sauvegarde une copie profonde après chaque modification du modèle. Maintenant, je me suis demandé si j'aurais pu coder différemment. Au lieu de sauvegarder les copies profondes, je pourrais peut-être sauvegarder une liste de chaque action de modification avec une modification inverse correspondante. Ainsi, je pourrais appliquer les modificateurs inversés au modèle actuel pour annuler, ou les modificateurs pour refaire.
Je peux imaginer comment vous pourriez exécuter des commandes simples qui modifient les propriétés des objets, etc. Mais qu'en est-il des commandes complexes ? Comme l'insertion de nouveaux objets nœuds dans le modèle et l'ajout d'objets lignes qui conservent les références aux nouveaux nœuds.
Comment s'y prendre pour mettre cela en œuvre ?
0 votes
Si j'ajoute le commentaire "Undo Algorthim", est-ce que cela me permettra de rechercher "Undo Algorithm" et de trouver ceci ? C'est ce que j'ai cherché et j'ai trouvé quelque chose de fermé en tant que duplicata.
0 votes
Nous utilisons le framework QT4 et nous avons besoin d'avoir des actions d'annulation et de rétablissement complexes. Je me demandais si vous aviez réussi à utiliser le Command-Pattern ?
3 votes
@umanga : Ça a marché mais ce n'était pas facile. La partie la plus difficile était de garder la trace des références. Par exemple, lorsqu'un objet Frame est supprimé, ses objets enfants : Nœuds, Charges agissant sur lui et beaucoup d'autres affectations de l'utilisateur devaient être conservés pour être réinsérés lorsqu'ils sont annulés. Mais certains de ces objets enfants étaient partagés avec d'autres objets, et la logique undo/redo devenait assez complexe. Si le modèle n'était pas si grand, je conserverais l'approche du mémento ; elle est beaucoup plus facile à mettre en œuvre.
0 votes
C'est un problème amusant à travailler, pensez à la façon dont les dépôts de code source le font, comme svn (ils conservent les différences entre les commits).