我有一个类,它根据访问者模式定义从AST(抽象语法树)到中间表示(IR)的转换。两个模型都是EMF模型,因此访问者扩展了AST模型的抽象EMF Switch类(我使用Xtext来定义AST)。访问者有一个状态作为它正在构建的IR的几个私有字段(本地变量的映射,正在翻译的当前过程,添加指令的块列表等)。
访问者为AST的所有结构实现方法,因此从caseExpressionInteger到caseStatementIf,共有21个公共'case'方法。我还有22个私有方法,除了几个只是助手的方法之外,其中大多数方法都与状态一起工作。
现在我发现代码变得太长了,我想重构它以便更容易管理(例如通过使用更小的类)。我的问题是我有哪些选择?
以下是我的想法:
你看到另一种方式吗?您认为最好的(更容易实施/维护)?我相信这是一个许多人必须拥有的问题,因为“访客”是一种非常普遍的模式。
答案 0 :(得分:2)
从你的描述中看来,Visitor类非常有凝聚力(这很好:))。我可能建议的唯一一件事就是将转换逻辑移到IR Builder并成为将命令发送给构建器的访问者(即Director角色)。在这种情况下,构建器将具有内部状态,从而利用访问者的负担。
也许我错过了一些东西,但是我没有看到子类化如何适合你的目的,所以我绝对会去代表团。
HTH
答案 1 :(得分:1)
一些私有字段(访问者修改/用于执行其工作的状态)。
听起来像是另一个可以委派一些工作的课程。
一般来说,你最好还是寻找代表机会。
这并不是特别针对访客模式的存在,如果没有更详细的问题,我们真的无法给出非常完整的答案。