Как реализовать отмену функциональности? - PullRequest
8 голосов
/ 13 декабря 2010

В моем приложении я хочу предоставить пользователю небольшую функциональность отмены. Существует не так много действий, которые пользователь может отменить. В частности, действия:

  • Добавление заметок к объекту
  • Цвет объекта
  • Пометить объект строкой

Теперь я подумал, как это реализовать. Сначала я подумал о классе действий, который является абстрактным базовым классом для трех различных действий, которые может выполнять пользователь. Каждый раз, когда пользователь выполняет эти действия, новый соответствующий экземпляр подкласса этого абстрактного класса Action создается и вставляется в список, содержащий все действия.

Всякий раз, когда пользователь хочет что-то отменить, список отображается для пользователя, и он может выбрать, какое действие он хочет отменить.

Теперь я думал, что должно храниться в таком объекте действия:

  • состояние объекта перед действием
  • фактическое действие, которое было предпринято (например, строка, которая была добавлена ​​к заметкам объекта)

Я не уверен, что этого достаточно. Я также подумал о чем-то вроде хронологического упорядочения, но это должно быть необходимо, поскольку список можно поддерживать в хронологическом порядке.

Есть ли еще что-то, что я должен рассмотреть?

Ответы [ 6 ]

15 голосов
/ 13 декабря 2010

Отмена / повтор обычно реализуется с помощью Command Pattern .Класс Action может быть использован в качестве основы для этого, но вам нужно действие 'do' и действие 'undo' внутри каждой команды. Вот пример этого на практике.Вам, вероятно, следует хранить команды, выполняемые в стеке, поскольку это значительно упрощает их реализацию и делает их более легкими для пользователя.

9 голосов
/ 13 декабря 2010

Вы можете сделать что-то простое, как это:

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;
}
5 голосов
/ 13 декабря 2010

вы должны реализовать шаблон команды для каждого действия, которое вы хотите отменить:

как реализовать операцию отмены / возврата без существенных изменений в программе

2 голосов
/ 13 декабря 2010

Для правильной и проверенной реализации функциональности UNDO - шаблон команды

2 голосов
/ 13 декабря 2010

Все кажется правильным, но я бы предпочел использовать стек, чем список.Это будет полезно в хронологическом порядке.

0 голосов
/ 17 мая 2013

Трудно не заметить это Simple-Undo-redo-library-for-Csharp-NET при добавлении функций Undo / Redo к существующим проектам.

...