1

我有一个类,它定义了从 AST(抽象语法树)到基于访问者模式的中间表示(IR)的转换。这两个模型都是 EMF 模型,因此访问者扩展了 AST 模型的抽象 EMF Switch 类(我使用 Xtext 来定义 AST)。访问者有一个状态,作为它正在构建的 IR 的一些私有字段(局部变量的映射、正在翻译的当前过程、要添加指令的块列表等)。

访问者为 AST 的所有构造实现方法,因此从 caseExpressionInteger 到 caseStatementIf,总共有 21 个公共“case”方法。我也有 22 个私有方法,除了几个只是助手的方法之外,其中大多数都与状态一起工作。

我现在发现代码变得太长了,我想重构它以使其更易于管理(例如,通过更小的类)。我的问题是我有什么选择?

这是我的想法:

  • 让几个类相互扩展,每个类添加访问者某些方法的实现
  • 有几个独立的类,以及一个委托给这些类的“主”类,将状态传递给一个单独的类
  • 混合两种方法(一些委托,一些继承)

你看到另一种方式吗?您认为什么最好(更容易实施/维护)?我相信这是许多人必须遇到的问题,因为“访客”是一种很常见的模式。

4

2 回答 2

2

根据您的描述,Visitor 类似乎很有凝聚力(这很好:))。我唯一可以建议的是将翻译逻辑移至 IR构建器,并成为将命令发送到构建器的访问者(即主管角色)。在这种情况下,构建器将拥有内部状态,从而利用访问者的负担。

也许我遗漏了一些东西,但我不知道子类化如何适合这里来实现你的目的,所以我肯定会去委托。

高温高压

于 2013-03-06T14:52:31.577 回答
1

一些私有字段(访问者修改/用于完成其工作的状态)。

听起来像是另一个类,一些工作将被委派给它。

一般来说,您最好寻找授权的机会。

这并不是特别针对访问者模式的存在,如果问题中没有更多细节,我们真的无法给出非常完整的答案。

于 2013-03-06T11:38:47.387 回答