Comments 3
Спасибо за статью.
В свое время тоже реализовывал undo/redo в десктопной программе на дельфи, а потом по требованию заказчика портировал ее на java под gwt. Интересно, что шел практически также по вашему пути ))).
От себя могу сказать, что лучше не смешивать модель и действия в одном классе. Т.е. у меня было
Все это управлялось в контроллере. Таким образом при какой-то обработке на сервере, где undo/redo не нужно, просто используются методы модели.
По поводу того, что отдельные классы для действий раздувают кодовую базу могу сказать, что раздувают они ее не так сильно. Сильно помогают inner классы в джаве. Например, если до undo/redo обработчик действия в контроллере выглядел примерно так
то с undo/redo это выглядит уже так
Да, вместо 1 строки получилось 12, но, имхо, это нагляднее, чем использовать отдельный файл с классом для действия. Кроме этого, используя менеджер команд вы можете навесить на выполнения команды какие-то специфические события, например перерисовку некоторых компонентво и т.п.
В свое время тоже реализовывал undo/redo в десктопной программе на дельфи, а потом по требованию заказчика портировал ее на java под gwt. Интересно, что шел практически также по вашему пути ))).
От себя могу сказать, что лучше не смешивать модель и действия в одном классе. Т.е. у меня было
- модель, которая предоставляла методы для работы с собой,
- команды, они же классы действий
- менеджер команд, который содержит список выполненных команд, а также куда отправляются команды на выполнение
Все это управлялось в контроллере. Таким образом при какой-то обработке на сервере, где undo/redo не нужно, просто используются методы модели.
По поводу того, что отдельные классы для действий раздувают кодовую базу могу сказать, что раздувают они ее не так сильно. Сильно помогают inner классы в джаве. Например, если до undo/redo обработчик действия в контроллере выглядел примерно так
model.setSomething(newValue);
то с undo/redo это выглядит уже так
actionManager.execute(new Action(){
String oldValue;
@override
public void execute(){
oldValue = model.getSomething();
model.setSomething(newValue);
}
@override
public void rollback(){
model.setSomething(oldValue);
}
});
Да, вместо 1 строки получилось 12, но, имхо, это нагляднее, чем использовать отдельный файл с классом для действия. Кроме этого, используя менеджер команд вы можете навесить на выполнения команды какие-то специфические события, например перерисовку некоторых компонентво и т.п.
0
в книге game design patterns описывается решение данной проблемы через паттерн команда и очередь команд. в гугле на первой странице находится, так что вводный абзац про то что эта задача якобы мало описана — бред.
-1
Sign up to leave a comment.
Articles
Change theme settings
Реализация функциональности многоуровневого undo/redo на примере прототипа электронной таблицы