在编写解析器时我应该使用哪种设计模式?

时间:2015-06-29 10:48:42

标签: .net parsing design-patterns xsd schema

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

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

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

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

那些" Ui元素"创建类以某种方式不将解析器绑定到asp.net层)

我希望根据一些设计模式以一种聪明的方式编写解析器,以便将来进行更简单的更改。

感谢。

1 个答案:

答案 0 :(得分:2)

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

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

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

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

这里浮现出两种模式 访问者(双重调度)和Intepreter(递归函数)。这是some tutorial - 它是Java,可以翻译成C#。

更新:适用于解析树的访客模式的详细说明:

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

  

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