【问题标题】:Parsing different xml messages. Versions解析不同的 xml 消息。版本
【发布时间】:2012-10-17 17:56:18
【问题描述】:

假设我们要将 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) 某种执行器模式(我不知道怎么做):在开始时定义某种规范对象,其中指示了将要使用的所有方法,并将该对象传递给负责执行它们的类。


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

提前致谢。 :)

【问题讨论】:

    标签: c++ xml parsing design-patterns


    【解决方案1】:

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

    我不想自己解析 XML,而是让像 CodesynthesisXSD 这样的东西为我生成所有需要的类并处理这些类。稍后当性能或其他问题成为问题时,我可能会开始寻找更高效的解析器,如果这没有结果,我会开始针对特定情况设计和编写自己的解析器。

    编辑:

    对不起,我应该更具体一点:P,第一部分已经完成 自动地,整个代码都是从 XML 模式生成的。

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

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

    【讨论】:

    • 对不起,我应该更具体一点:P,第一部分是自动完成的,整个代码是从 XML 模式生成的。这就是为什么我对此并不担心。 :)
    • @Mario np,我们自己的情况总是很清楚,很难想象其他人会以完全不同的方式看待事物。
    猜你喜欢
    • 1970-01-01
    • 2017-10-10
    • 1970-01-01
    • 1970-01-01
    • 2016-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多