gpt4 book ai didi

java - Swing/Java3D 应用程序中基于状态的撤销 : AOP solution?

转载 作者:行者123 更新时间:2023-12-04 06:02:48 25 4
gpt4 key购买 nike

我负责维护用 Swing 编写的旧应用程序,并结合用 Java3D 编写的类似 CAD 的工具。我们遇到了内存使用问题。分析之后,这与应用程序中的撤消功能有关。

所有撤消功能都是基于状态的,具有如下基本概念:

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

创建这些 UndoAction 的代码在整个应用程序中基本上随处可见。因为新对象的修改、现有对象的修改和子树的修改之间没有区别,所以会发生以下情况:

发生的事情是单个 Action 如下:
  • 创建新对象 A .
  • 修改字段 foo的对象。一个新的 UndoAction 被放置在栈上,它包含 foo_old 和 foo_new。
  • 修改字段 bar的对象。一个新的 UndoAction 被放置在堆栈上,其中包含 bar_old 和 bar_new。
  • 执行 B.setField(A) .一个新的 UndoAction 被放置在堆栈上,其中包含 field_old 和 field_new (== A)。

  • 根本没有粒度或对此进行任何控制。这根本无助于可维护性。

    我想重构这个系统,使它变得可维护和内存友好。不幸的是,使用命令模式实现撤消系统是不可能的;这些行动影响太大而无法恢复。我想实现以下内容:
  • 使用注释提供“撤消分界”。 @Undoable() 会将方法标记为生成放置在堆栈上的 UndoAction。这可以像事务一样进行参数化:REQUIRE、NEST、JOIN... 在进入 Undoable 方法时克隆完整的对象图。
  • 当事务(=方法)完成时,算法应该将新状态与旧状态进行比较并保存差异。
  • 为了实现这一点,我们可以使用 AOP。这使我们能够保持核心代码非常干净。

  • 现在,我的问题:
    Java 中是否已经存在上述 3 个功能中的任何一个?我可以想象我不是第一个与基于状态的撤消以及与之相关的问题(撤消分界、状态比较……)

    最佳答案

    在这个问题公开了一段时间之后,问题似乎是:“不,这样的框架已经不存在了。”

    作为其他人的指南,我正在调查 Eclipse Modeling FrameworkEMF.Edit框架。在这个框架中,您用描述符语言定义模型,框架为您处理模型和任何操作。这会自动创建操作和撤消/重做。

    关于java - Swing/Java3D 应用程序中基于状态的撤销 : AOP solution?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8745240/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com