我有一个类定义了从 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/