Интересуют способы реализации отката в сложных программах, как пример Adobe Photoshop.
У меня есть программа. Она очень сложная. Например при создании экземпляра класса создается перечень новых зависимостей и разные HTML части.
Пример что происходит при нажатии на кнопку (создать класс).
-Создается массив класса {id: ....}
-Массив папок [....]
-Массив CSS {id: ....}
-Создается HTML код папки
-Создается HTML код CSS
-Создаются слушатели изменений
-Далее перерасчет всех счетчиков
-И по мелочам всяким ....
И вот как в таком случае быть? Много разных операций происходит. Я без понятия, как нечто подобное реализуют в продуктах от Adobe.
Подскажите плиз, в каком направление мне искать?
Илья, Именно команды. Весь ваш документ будет описываться как список команд, будете проигрывать от одного положения к другому. Состояния это несколько другое. Впрочем можете комбинировать.
Илья, в качестве дополнительного подтверждения: [1], [2].
Через State тоже делают, это в локальной терминологии будет называться Snapshot. Метод подходит там, где состояние имеет небольшой размер. FSM, при этом, обретает вырожденный линейный характер, что немножко намекает на плохую пригодность State для решения этой задачи.
Блин спасибо! Искал искал не чего не находил, наверно вопрос гугл не правильно задавал))
Вроде принцип работы понял, буду думать, придется конечно построчить не мало кода для его работы.
Евгений Шатунов, да спасибо, я почитал. Мне не приходилось реализовать десктопные приложения с отменой действий, но после прочитанного первое что приходит в голову — snapshot + ограниченный буфер односторонних патчей. Наверное потому что я видел в фотошопе когда-то, что можно настраивать количество отменяемых действий. То есть текущее состояние программы это snapshot + все патчи. Когда достигаем предела буфера то snapshot += oldestPatch
PS. Я прочитал про команду с методами do и undo, но смущает что если где-то неправильно был реализован undo, то вся цепочка отмен может быть протеряна