1

假设我们要将 XML 消息解析为业务对象。我们将流程分为两部分,即:

- 将 XML 消息解析为 XML 语法对象。-将 XML 对象转换为业务对象。

第一部分是自动完成的,为每个节点生成一个语法对象。

到目前为止,第二部分是按照 XML 架构完成的。例子:

如果我们有 XML 消息(简体):

<Main>
  <ChildA>XYZ</ChildA>
  <ChildB att1="0">
     <InnerChild>YUK</InnerChild>
  </ChildB>
</Main>

我们可以找到以下类:

DecodeMain(Calls DecodeChildA and B)
  DecodeChildA
  DecodeChildB(Calls DecodeInnerChild)
     DecodeInnerChild

当我们需要处理相同消息的版本时,主要问题就出现了。假设我们有一个只有 DecodeInnerChild 更改的新版本(例如:我们需要在值的末尾添加一个“a”)

解决方案对于更多版本的敏捷性和尽可能干净是非常重要的。我考虑了以下选项:


1)简单继承:创建两个DecodeInnerChild类。每个版本一个。

缺点:我需要为每个父类创建不同的类来调用正确的类。


2)版本参数:为每个方法添加一个以版本为参数的对象。这样,我们将根据每个版本知道在每个方法中要做什么。

缺点:一点都不干净。不同版本的代码是混用的。


3)继承+版本参数:为直接改变的节点(如InnerChild)的公共代码创建2个基类,并在每个方法中添加版本作为参数。当一个节点调用另一个类来解码子对象时,它将根据版本参数使用一个或另一个类。


4)某种执行者模式(我不知道怎么做):在开始时定义某种规范对象,其中指示了将要使用的所有方法,我将这个对象传递给一个类负责执行他们。


你会怎么做?欢迎其他想法。

提前致谢。:)

4

1 回答 1

2

你会怎么做?欢迎其他想法。

与其自己解析 XML,不如先让CodesynthesisXSD 之类的东西为我生成所有需要的类并处理这些类。稍后当性能或某些事情成为问题时,我可能会开始寻找更有效的解析器,如果这没有结果,那么我会开始为特定情况设计和编写自己的解析器。

编辑:

抱歉,我应该更具体一点:P,第一部分是自动完成的,整个代码是从 XML 模式生成的。

好的,然后让我们讨论如何处理随着软件的发展您最终也会发展输入的常见情况。我把所有的银弹和魔杖都放在了这里的桌子上。是否以及您对它们实施什么完全取决于您。

  1. 无论如何,我创建的大多数东西都有版本属性。在不能优雅地解决的向后兼容性问题之前是理智的。最重要的是,它实现了当旧软件无法解析新输入时,它会产生对每个人都立即有意义的抱怨。
  2. 我通常还会为转换器添加一些接口。因此,当旧软件无法解析时,可以从新版本的输入中配备转换器。新软件也可以使用相同的转换器来解析旧输入。另外,它是从完全“外星人”输入中插入转换器的地方。双赢局面。;)
  3. 在微小变化的特殊情况下,我会考虑让 new 在内部更灵活是否便宜,DecodeInnerChild因此接受带有或不带有“a”的值作为有效值。在转换器中,当转换为旧版本时,我仍然必须摆脱那个“a”。
  4. 通常实际发生的是InnerChild拆分,两个版本将并排使用。如果两个 s 之间存在足够的行为差异,InnerChild那么就没有必要避免 polymorphic InnerChilds。当添加多态性时,确实就像您在 1) 中所说的那样,所有包含现在具有此类多态成员的类都必须更改。转换器通常应该在这种情况下产生残缺InnerChild或转发到输入超出其能力的旧版本。
于 2012-10-27T22:24:57.220 回答