Лучшая практика реализации 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))]. Формат: (операция с элементом, значение элемента, номер элемента в массиве). Такой вариант будет занимать меньше места в памяти (на больших массивах чем в примере), однако сложнее восстановить объект.

Собственно, вопрос

Какой из этих вариантов (или какой-то иной, возможно), вы считаете оптимальным и удобным?


Ответы (0 шт):