【问题标题】:Which design pattern/s should I use when writing a parser?编写解析器时应该使用哪种设计模式?
【发布时间】:2015-09-15 19:16:19
【问题描述】:

我正在编写XSD解析器,它将用于根据解析的XSD在表单上生成asp.net控件。

XSD 从某个位置(例如从 DB)加载到 XsdSchema 对象,然后使用 .NET 类(架构对象模型)读取该架构的元素以生成要在表单上呈现的控件列表.

您认为哪种模式最适合在这种情况下使用?

(目前我已经创建了类来表示不同类型的控件-文本、日期、列表等,并且我的 xsd 解析器类有一个方法可以根据解析的 XSD 返回这些类的列表。

创建那些“Ui Element”类是为了不将解析器绑定到 asp.net 层)

我想根据一些设计模式以某种智能的方式编写解析器,以便将来进行更简单的更改。

谢谢。

【问题讨论】:

    标签: .net parsing design-patterns xsd schema


    【解决方案1】:

    TL;DR:访问者模式(双重调度)和解释器模式(递归函数)可用于翻译树(复合模式),在您的情况下,将表单元素树转换为 UI 控件树。 Here is a smart article on that.

    在解析时,考虑树而不是列表会很有用(您的控件列表很可能有一个父控件,所以它实际上是一棵树)。简而言之,树是一种递归数据结构——一个具有标量 id 的节点和一个子节点列表,这些子节点指向其他节点,其子节点也指向其他节点,依此类推。

    XML 可以看作是一种树序列化(实际上是图,但树是一种常见的特殊情况),XSD 也是如此。因此,假设 XSD 包含一个表单元素树,需要将其转换为 UI 元素树。

    这可以通过遍历表单树来完成——以某种顺序枚举节点,为每个节点创建一个 UI 控件并构建 UI 控件树。

    这里想到的两种模式是 访问者(双重调度)和解释者(递归函数)。这是some tutorial——它是用Java编写的,可以翻译成C#。

    更新:很好地描述了适用于解析树的访问者模式:

    How to write the Visitor Pattern for Abstract Syntax Tree in Python?

    你的 AST 中的每个节点都需要实现一个 accept() 方法(不是一个 visit() 方法)。该方法将访问者对象作为参数。在此 accept() 方法的实现中,您调用访问者对象的一个​​ visit() 方法(每种 AST 节点类型都有一个;在 Java 中,您将使用参数重载,在 Python 中我想您可以使用不同的visit_*() 方法)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-23
      相关资源
      最近更新 更多