Организация Undo/Redo
Делаю небольшое тестовое задание на собеседование. Задание довольно простое - примитивный графический редактор, с размещением, вращением, перемещением и удалением фигур, а также возможностью сохранения и загрузки сцены. По сути, всё уже сделано, кроме одного, последнего пункта - Undo/Redo. Надо сделать возможность отменять все вышеуказанные действия.
Собсно, вопрос - как лучше всего реализовать Undo/Redo? В принципе, можно сделать какую-то универсальную структуру, отображающую изменение фигуры, в ходе изменений заносить новые структуры в список, при нажатии кнопки, совершать обратные действия, а саму структуру заносить в список Redo.
Но, хочу услышать мнение со стороны.
Ответ
В общем, сделал структурой, в которой записывается инфа о состоянии вершины, и совершенное действие (энумератором). Отменяет не все действия, но для отмены базовых работает. Ибо для отмены, например, очистки и загрузки сцены, нужно реально делать снапшоты.
Смотрите также:
Комментарии
Либо снапшотами состояния, либо (как бы я сделал), каждое действие классом с методами вроде do и undo.
имхо в данном случае лучше делать так
либо (как бы я сделал), каждое действие классом с методами вроде do и undo.
В общем, сделал структурой, в которой записывается инфа о состоянии вершины, и совершенное действие (энумератором). Отменяет не все действия, но для отмены базовых работает. Ибо для отмены, например, очистки и загрузки сцены, нужно реально делать снапшоты.
lentinant, так как бы снапшоты тоже укладываются в такое.
Скажем объект-действие "очистки" имеет:
- инфу о том, что он очистил (снапшот)
- метод undo (восстановление данных из снапшота)
- метод do (сама процедура очистки)
на сохранение хватило, а на снапшот не хватило? :)
Для сохранения достаточно один раз записать состояние сцены. Для снапшотов надо сделать кучу доп. методов. Например, метод создания нового снапшота. Можно каждое действие записывать всё заново в снапшот, но при этом, если у нас сотня фигур, и изменение произошло только с одним, зачем нам переписывать оставшиеся 99 фигур? И тому подобное.
lentinant, снапшот это и есть разовое сохранение состояния сцены. Сохранение действий - это протокол (лог). Если в протоколе действие не поддерживающее локальный откат, тогда делается снапшот чтобы потом его восстановить. Если у тебя уже есть протокол и восстановление по нему, то снапшоты, это просто промежуточные полные сохранения для действий, которые ты не умеешь откатывать.
Возможность добавлять комментарии была ограничена
CollectableItemData.cs
[CreateMenuItem(fileName = "newItem", menuName = "Data/Items/Collectable", order = 51]