Вопрос нужен, чтобы оценить, понимает ли кандидат, почему Undo/Redo для Canvas сложнее, чем для обычного UI-состояния.
Canvas не хранит состояние объектов, поэтому его нельзя «откатить» автоматически. Для Undo/Redo нужно самостоятельно сохранять историю изменений. Основные сложности связаны с объёмом данных, производительностью и корректным восстановлением сцены. Часто приходится выбирать между хранением снимков состояния и хранением операций.
Canvas — императивный API, и после отрисовки он не знает, какие объекты и действия к ней привели. Это напрямую влияет на реализацию Undo/Redo.
Перед реализацией важно понимать основные проблемы:
Отсутствие встроенного состояния
Canvas не знает про фигуры и слои
Всё состояние нужно хранить отдельно
Объём данных
Полные снапшоты сцены могут быть большими
Частые изменения быстро раздувают историю
Производительность
Восстановление состояния может требовать полной перерисовки
Это особенно критично для сложных сцен
Хранение снимков состояния
сериализация всех объектов
простой откат
большой расход памяти
Хранение команд
сохраняются действия (add, move, resize)
меньше памяти
сложнее реализовать
действие → запись в историю
Undo → откат состояния
Redo → повтор действия
Undo/Redo для Canvas — это задача управления историей состояния сцены. Выбор между снапшотами и командами зависит от сложности сцены и требований к производительности.