java - Java 访问者的重构选项

标签 java oop design-patterns refactoring

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

访问者为 AST 的所有构造实现方法,因此从 caseExpressionInteger 到 caseStatementIf,总共有 21 个公共(public)“case”方法。我还有 22 个私有(private)方法,除了几个只是帮助方法的方法外,其中大部分都与状态一起工作。

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

这是我的想法:

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

你还有别的办法吗?您认为什么最好(更易于实现/维护)?我相信这是很多人都遇到过的问题,因为“访客”是一种很常见的模式。

最佳答案

从您的描述来看,Visitor 类似乎非常内聚(这很好 :))。我唯一建议的是将翻译逻辑移至 IR Builder并成为向构建者发送命令的访问者(即主管角色)。在这种情况下,构建器将拥有内部状态,从而减轻访问者的负担。

也许我遗漏了什么,但我看不出子类化如何适合这里来实现您的目的,所以我肯定会选择委派。

HTH

关于java - Java 访问者的重构选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15245737/

相关文章:

java - 在文本区域中突出显示句子

java - Pivotal tc Server v.3.1 无法启动

PHP - 只能由另一个类实例化的类

java - 静态方法属于类而不是类的对象

javascript - D3.js 进入退出更新模式实现

javascript - 尝试将我的所有 JS 连接到一个文件中并需要一些 JS 框架/模式类型建议

Ruby:我应该如何访问类中的实例变量?

java - Eclipse 在控制台中显示旧输出

java - 如何用父子对象制作对象?

python - 具有 __init_subclass__ 和可子分类注册表的注册表模式