Pull to refresh

Comments 3

Спасибо за статью.
В свое время тоже реализовывал 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, но, имхо, это нагляднее, чем использовать отдельный файл с классом для действия. Кроме этого, используя менеджер команд вы можете навесить на выполнения команды какие-то специфические события, например перерисовку некоторых компонентво и т.п.
Спасибо за комментарий, я совершенно согласен насчёт того, что правильнее отделять менеджер команд от модели… разве что для простоты и скорости написания решения иногда можно поступиться перфекционизмом.
в книге game design patterns описывается решение данной проблемы через паттерн команда и очередь команд. в гугле на первой странице находится, так что вводный абзац про то что эта задача якобы мало описана — бред.
Sign up to leave a comment.

Articles

Change theme settings