【问题标题】:What's the best way to synchronize the state of 2 complex object graph同步2个复杂对象图状态的最佳方法是什么
【发布时间】:2009-11-17 05:52:21
【问题描述】:

我有一个复杂的对象图来表示操作调度。 有一次,我必须将整个图形序列化到 Web UI(通过 XML/JSON),以让用户使用基于 Javascript 的甘特图组件修改计划。 用户完成编辑后,Java/服务器层的图状态必须与修改后的状态同步。

我想问一下实现复杂对象图的这种状态同步的最佳策略,例如应该如何表示状态的变化,以便模仿服务器端的变化变得容易? 其他人将如何实现这一点?

仅供参考,我目前的技术堆栈:JSF+Richfaces、Seam 2.1、Hibernate 3。 但我相信这个问题的解决方案也可以用于其他技术栈。

【问题讨论】:

    标签: java .net web-applications


    【解决方案1】:

    我建议避免同步两个图表,而是将编辑操作记录为“删除节点/插入节点/替换节点”操作。将此操作发送到服务器并将它们应用于原始图形。

    这个想法源于重写 AST(抽象语法树)。在eclipse JDT you have an AST from your source。当应用重构(例如重命名方法)时,应该可以创建更改的预览。为此,重写事件(删除/插入/替换)被记录并应用于 AST 的副本。由此生成预览。如果用户接受,则将事件应用于原始 AST。

    您的问题在这种情况下是相似的,您有两个开始相同的对象图,应该以相同的方式进行修改。这应该更容易实现为同步操作,您只需在用户修改图表时记录事件。

    【讨论】:

      【解决方案2】:

      我正在处理一个具有相同(正常?)问题的大型项目。设计人员基于 DTO 模式和 CMP2 实现了以下解决方案:

      一般的想法是,每个 bean,代表图中的一个对象,可以记录自己的变化。因此,每个 bean 都有一个额外的结构(集合),其中仅存储更改的 bean 属性(值)的键(列名)。服务器逻辑使用这些提示来更新存储的数据。服务器逻辑可以使用这些提示来仅更新更改。

      (简化的!)bean 本身看起来有点像这样:

      public TableBean {
      
        private String column1;
      
        // ... more fields
      
        private Set<String> changes = new Set<String>();
      
        public String getColumn1() {
          return column1;
        }
      
        public void setColumn1(String value) {
          if (!value.equals(column1)) {
            changes.add("column1");
            column1 = value;
          }
        }
      
        public Collection<String> getChanges() {
          return changes;
        } 
      }
      

      相应地处理子关系,还有另一个结构记录那些必须删除的子图。

      这甚至可能是一个标准的 j2ee 模式,如果是这种情况,请评论。

      (除此之外,我更喜欢 Arne 的新设计解决方案!)

      【讨论】:

      • 这个模式叫什么名字?
      • 正如我试图解释的那样 - 我不知道这是否是或遵循标准模式,我也想知道这一点。
      猜你喜欢
      • 1970-01-01
      • 2011-09-03
      • 2012-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-09
      • 2020-09-27
      • 1970-01-01
      相关资源
      最近更新 更多