我有一个类,它定义了从 AST(抽象语法树)到基于访问者模式的中间表示(IR)的转换。这两个模型都是 EMF 模型,因此访问者扩展了 AST 模型的抽象 EMF Switch 类(我使用 Xtext 来定义 AST)。访问者有一个状态,作为它正在构建的 IR 的一些私有字段(局部变量的映射、正在翻译的当前过程、要添加指令的块列表等)。
访问者为 AST 的所有构造实现方法,因此从 caseExpressionInteger 到 caseStatementIf,总共有 21 个公共“case”方法。我也有 22 个私有方法,除了几个只是助手的方法之外,其中大多数都与状态一起工作。
我现在发现代码变得太长了,我想重构它以使其更易于管理(例如,通过更小的类)。我的问题是我有什么选择?
这是我的想法:
- 让几个类相互扩展,每个类添加访问者某些方法的实现
- 有几个独立的类,以及一个委托给这些类的“主”类,将状态传递给一个单独的类
- 混合两种方法(一些委托,一些继承)
你看到另一种方式吗?您认为什么最好(更容易实施/维护)?我相信这是许多人必须遇到的问题,因为“访客”是一种很常见的模式。