Лучшая практика реализации undo/redo
Как лучше всего хранить и обрабатывать историю ввода пользователя для undo/redo? Рассмотрим на условном массиве чисел, где любая операция (добавление нового, удаление одного из существующих элементов, изменение элемента) может повлиять на другие элементы массива.
Например, при добавлении в массив [1,2,7,8]
элемента 5
, элементы 7,8
должны удалиться, результат операции: [1,2,5]
.
Варианты решения
Я придумал два варианта хранения истории: хранить историю объекта целиком или хранить историю об операциях.
Например, если хранить объект целиком, получается что-то в духе:
history = [[1,2,7,8], [1,2,5]]
Такой вариант записи удобно восстанавливать, но он занимает много места в памяти.
Если хранить историю об операциях, получается: history = [(('del', 8, 3), ('del', 7, 2), ('add', 5, 2))]
. Формат: (операция с элементом, значение элемента, номер элемента в массиве). Такой вариант будет занимать меньше места в памяти (на больших массивах чем в примере), однако сложнее восстановить объект.
Собственно, вопрос
Какой из этих вариантов (или какой-то иной, возможно), вы считаете оптимальным и удобным?