.net - 编写解析器时应该使用哪种设计模式?

标签 .net parsing design-patterns xsd schema

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

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

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

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

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

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

谢谢。

最佳答案

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?

Each node in your AST would need to implement an accept() method (NOT a visit() method). The method takes, as an argument, a visitor object. In the implementation of this accept() method, you call a visit() method of the visitor object (there will be one for each AST node type; in Java, you’ll use parameter overloading, in Python I suppose you can use different visit_*() methods).

关于.net - 编写解析器时应该使用哪种设计模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31113759/

相关文章:

.net - 跨多个解决方案重构共享代码

.net - 实现自己的 MVVM 还是使用 MVVM 框架?

java - 使用迭代器模式java使用一个循环打印出两个数据结构

java - 这个例子是否违反了好莱坞原则 "dont call us, we call you"

c# - 为什么 .NET/C# 不针对尾调用递归进行优化?

c# - 如何使用 "Resources embedded in resx"的资源?

c++ - 解析 xpath 表达式

java - 外观和 DAO 之间适合什么模式?

linux - 使用 sed 解析 nmap -oG 输出

java - 检查一个字符串是否可以在没有 try-catch 的情况下解析为 Long?