Question

Dans ma demande je veux fournir à l'utilisateur une petite fonctionnalité d'annulation. Il n'y a pas beaucoup d'actions que peut être annulée par l'utilisateur. les actions sont particulièrement:

  • Ajouter des notes à un objet
  • Couleur d'un objet
  • Tag a objcet avec une chaîne

Maintenant, je pensais à la façon de mettre en œuvre. J'ai d'abord pensé à une classe d'action qui est la classe de base abstraite pour les 3 différentes actions qui peuvent être prises par l'utilisateur. Chaque fois que l'utilisateur prend de ces actions, une nouvelle instance appropriée d'une sous-classe de cette classe abstraite d'action est créé et inséré dans une liste qui contient toutes les actions.

Dès que l'utilisateur veut annuler quelque chose, la liste est affichée à l'utilisateur et il peut choisir l'action qu'il veut défaire.

Maintenant, je pensais ce que doit être stocké dans un tel objet d'action:

  • l'état de l'objet avant que l'action
  • l'action réelle qui a été prise (par exemple la chaîne qui a été ajouté aux notes d'un objet)

Je ne sais pas si cela suffit. Je pensais aussi à quelque chose comme un ordre chronologique, mais cela ne devrait être nécessaire puisque la liste peut être maintenue chronologiquement correcte.

Y at-il d'autres choses que je devrais considérer?

Était-ce utile?

La solution

Undo / Redo est généralement mis en œuvre avec le Commande Motif . La classe Action peut être utilisé comme base pour cela, mais vous avez besoin d'une action « faire » et une action « undo » au sein de chaque commande. Voici un exemple de ce dans entraine toi. Vous devriez probablement enregistrer les commandes exécutées dans une pile comme il est beaucoup plus facile à mettre en œuvre et beaucoup plus facile pour l'utilisateur de suivre.

Autres conseils

Vous pourriez faire simple quelque chose comme ceci:

Stack<Action> undoStack = new Stack<Action>();    

void ChangeColor(Color color)
{
    var original = this.Object.Color;
    undoStack.Push(() => this.Object.Color = original);
    this.Object.Color = color;
}

vous devez mettre en œuvre le Motif Commande pour chaque action que vous voulez undo:

comment mettre en œuvre undo / redo opération sans changements majeurs dans le programme

Tout semble correct, mais je préfère utiliser la pile de liste. Il sera utile dans l'aspect chronologique de commande.

Pour la mise en œuvre correcte et éprouvée pour la fonctionnalité est UNDO modèle de commande

Il est difficile de négliger cette simple-Annuler -redo-bibliothèque pour-Csharp-NET lors de l'ajout des fonctionnalités Undo / Redo aux projets existants.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top