Делаю небольшое тестовое задание на собеседование. Задание довольно простое - примитивный графический редактор, с размещением, вращением, перемещением и удалением фигур, а также возможностью сохранения и загрузки сцены. По сути, всё уже сделано, кроме одного, последнего пункта - Undo/Redo. Надо сделать возможность отменять все вышеуказанные действия.
Собсно, вопрос - как лучше всего реализовать Undo/Redo? В принципе, можно сделать какую-то универсальную структуру, отображающую изменение фигуры, в ходе изменений заносить новые структуры в список, при нажатии кнопки, совершать обратные действия, а саму структуру заносить в список Redo.
Но, хочу услышать мнение со стороны.

Принятый ответ

В общем, сделал структурой, в которой записывается инфа о состоянии вершины, и совершенное действие (энумератором). Отменяет не все действия, но для отмены базовых работает. Ибо для отмены, например, очистки и загрузки сцены, нужно реально делать снапшоты.
`
ОЖИДАНИЕ РЕКЛАМЫ...
6
29
9 лет назад
6
Либо снапшотами состояния, либо (как бы я сделал), каждое действие классом с методами вроде do и undo.
0
28
9 лет назад
0
имхо в данном случае лучше делать так
либо (как бы я сделал), каждое действие классом с методами вроде do и undo.
0
26
9 лет назад
Отредактирован lentinant
0
В общем, сделал структурой, в которой записывается инфа о состоянии вершины, и совершенное действие (энумератором). Отменяет не все действия, но для отмены базовых работает. Ибо для отмены, например, очистки и загрузки сцены, нужно реально делать снапшоты.
Принятый ответ
1
27
9 лет назад
1
lentinant, так как бы снапшоты тоже укладываются в такое.
Скажем объект-действие "очистки" имеет:
  • инфу о том, что он очистил (снапшот)
  • метод undo (восстановление данных из снапшота)
  • метод do (сама процедура очистки)
0
26
9 лет назад
0
Extravert:
lentinant, так как бы снапшоты тоже укладываются в такое.
Скажем объект-действие "очистки" имеет:
  • инфу о том, что он очистил (снапшот)
  • метод undo (восстановление данных из снапшота)
  • метод do (сама процедура очистки)
На снапшоты не хватило времени и терпения.
0
14
9 лет назад
0
lentinant, на сохранение хватило, а на снапшот не хватило? :)
0
26
9 лет назад
0
на сохранение хватило, а на снапшот не хватило? :)
Для сохранения достаточно один раз записать состояние сцены. Для снапшотов надо сделать кучу доп. методов. Например, метод создания нового снапшота. Можно каждое действие записывать всё заново в снапшот, но при этом, если у нас сотня фигур, и изменение произошло только с одним, зачем нам переписывать оставшиеся 99 фигур? И тому подобное.
0
14
9 лет назад
0
lentinant, снапшот это и есть разовое сохранение состояния сцены. Сохранение действий - это протокол (лог). Если в протоколе действие не поддерживающее локальный откат, тогда делается снапшот чтобы потом его восстановить. Если у тебя уже есть протокол и восстановление по нему, то снапшоты, это просто промежуточные полные сохранения для действий, которые ты не умеешь откатывать.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.