Я использую POCO (объекты класса) для каждого типа данных в памяти. У меня есть множество функций, которые работают с ними и изменяют их по-разному. Каков простой способ добиться функциональности отмены/возврата с минимальными изменениями в коде? Некоторые идеи:
Журнал изменений с помощью ORM – Журналирование на уровне свойств. Методы, которые изменяют POCO, должны регистрировать каждое изменяемое ими свойство или изменять свойства через ORM вместо того, чтобы работать непосредственно с указанными POCO. ORM будет регистрировать изменения и иметь возможность вернуться при необходимости.
Глубокое клонирование и сравнение — шаблон Memento - Сохраняйте глубокие клоны объектов перед их изменением (тратится память впустую, медленно). После внесения изменений вызовите функцию, которая вычисляет различия в свойствах объекта (должна перебирать все свойства, медленно, утомительно, рекурсивно). Различия сохраняются в журнале, чтобы иметь возможность вернуться к ним позже.
Каждая команда поддерживает отмену/возврат — Шаблон команды — классический подход, но потребовал бы слишком много дополнений в коде. Я ищу что-то общее, и в идеале что-то, что не требует переписывания приложения с нуля.
Я не знаю типичных подходов к такого рода проблемам, но, учитывая их довольно распространенность, я уверен, что есть хорошие шаблоны для решения этой проблемы без особых хлопот. Знаете ли вы какой-либо шаблон/библиотеку, которая простым способом обрабатывает историю для POCO?
В настоящее время я просматриваю следующее, но все еще ищу лучшие подходы.
- http://www.codeproject.com/Articles/43436/Undo-Redo-Framework
- http://www.codeproject.com/Articles/10947/A-simple-framework-for-adding-undo-redo-support
- http://www.codeproject.com/Articles/456591/Simple-Undo-redo-library-for-Csharp-NET
- http://www.codeproject.com/Articles/1356/Undo-Manager
- http://www.codeproject.com/Articles/10576/An-Undo-Redo-Buffer-Framework
- http://www.codeproject.com/Articles/19550/Automated-Undo-Redo-library-based-on-Csharp-Generi
- http://www.codeproject.com/Articles/33371/Multilevel-Undo-and-Redo-Implementation-in-Csharp-
UndoableBase
, который обрабатывает отмену и может быть легко изменен для повторного выполнения, заслуживает рассмотрения, даже если вы этого не делаете. используй это. - person Adam Houldsworth   schedule 20.01.2014