重构Java访问者的选项

时间:2013-03-06 11:09:17

标签: java oop design-patterns refactoring

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

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

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

以下是我的想法:

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

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

2 个答案:

答案 0 :(得分:2)

从你的描述中看来,Visitor类非常有凝聚力(这很好:))。我可能建议的唯一一件事就是将转换逻辑移到IR Builder并成为将命令发送给构建器的访问者(即Director角色)。在这种情况下,构建器将具有内部状态,从而利用访问者的负担。

也许我错过了一些东西,但是我没有看到子类化如何适合你的目的,所以我绝对会去代表团。

HTH

答案 1 :(得分:1)

  

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

听起来像是另一个可以委派一些工作的课程。

一般来说,你最好还是寻找代表机会。

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