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

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

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

这是我的想法:


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


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

最佳答案

从您的描述看来,Visitor类非常有凝聚力(这很不错:)。我可能建议的唯一一件事就是将翻译逻辑移至IR Builder并成为将命令发送给构建者的访客(即Director角色)。在这种情况下,建造者将处于内部状态,从而利用了访客的负担。

也许我缺少了一些东西,但是我看不到子类化如何适合您的目的,因此我绝对会委托。

高温超导

10-06 07:32