Отмена на основе состояния в приложении Swing / Java3D: решение AOP? - PullRequest
2 голосов
/ 05 января 2012

Я отвечаю за обслуживание старого приложения, написанного на Swing, в сочетании с CAD-подобным инструментом, написанным на Java3D.У нас проблемы с использованием памяти .После профилирования это связано с функциональностью отмены в приложении.

Все функции отмены основаны на состоянии, с базовой концепцией, такой как:

public class UndoAction {
  private UndoTarget target;
  private Object old_data;
  private Object new_data;
}

Код для создания этих действий отмены:в основном замусорено на протяжении всего приложения.Поскольку не существует различий между модификациями новых объектов, модификациями существующих объектов и модификациями поддеревьев, происходит следующее:

То, что происходит при одном действии, является следующим:

  • Создатьновый объект A.
  • Изменить поле foo объекта.Новый UndoAction помещается в стек, который содержит foo_old и foo_new.
  • Изменить поле bar объекта.Новое действие UndoAction помещается в стек, который содержит bar_old и bar_new.
  • Execute B.setField(A).Новое действие UndoAction помещается в стек, который содержит field_old и field_new (== A).

Нет детализации или какого-либо контроля над этим вообще.Это совсем не помогает в обслуживании.

Я хочу реорганизовать эту систему, чтобы она стала удобной для обслуживания и памяти.К сожалению, реализация системы отмены с использованием шаблона Command невозможна;действия слишком влиятельны, чтобы вернуться.Я хочу реализовать следующее:

  1. Используйте аннотации для предоставления «Отменить демаркацию».@Undoable () помечает метод как генерирующий UndoAction, который помещается в стек.Это может быть параметризовано так же, как транзакции: REQUIRE, NEST, JOIN ... Полный граф объекта клонируется при входе в метод Undoable.
  2. Когда транзакция (= метод) завершается, алгоритм должен сравнивать новое состояниесо старым состоянием и сохранением различий.
  3. Для реализации этого мы можем использовать АОП.Это позволяет нам поддерживать основной код в чистоте.

Теперь мой вопрос: Существует ли какая-либо из 3 вышеупомянутых функций в Java?Я могу себе представить, что я не первый, кто борется с отменой на основе состояния и связанными с этим проблемами (Отмена разграничения, сравнение состояний, ...)

Ответы [ 2 ]

2 голосов
/ 23 февраля 2012

После того, как этот вопрос был открыт в течение достаточно долгого времени, кажется, что вопрос звучит так: «Нет, таких рамок уже не существует».Eclipse Modeling Framework и EMF.Edit framework.В этом фреймворке вы определяете модель на языке дескриптора, а фреймворк обрабатывает модель и любые манипуляции для вас.Это автоматически приводит к созданию действий и отмены / повторения.

1 голос
/ 23 февраля 2012

Для справки, еще одна структура, которая может служить моделью (если не решение), это UndoManager, которая поддерживает ограниченное количество правок.Он является частью пакета javax.swing.undo, одного из нескольких основных компонентов текстовых компонентов .

...