Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java访问者的重构选项_Java_Oop_Design Patterns_Refactoring - Fatal编程技术网

Java访问者的重构选项

Java访问者的重构选项,java,oop,design-patterns,refactoring,Java,Oop,Design Patterns,Refactoring,我有一个类,它定义了从AST(抽象语法树)到基于访问者模式的中间表示(IR)的转换。这两个模型都是EMF模型,因此访问者扩展了AST模型的抽象EMF开关类(我使用Xtext来定义AST)。访问者有一个状态作为它正在构建的IR的几个私有字段(局部变量映射、正在翻译的当前过程、要添加指令的块列表等) 访问者为AST的所有构造实现方法,因此从CaseExpressionIntegrater到caseStatementIf,总共有21个公共“case”方法。我也有22个私有方法,除了几个只是助手的方法外

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

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

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

以下是我的想法:

  • 让几个类彼此扩展,每个类为访问者的某些方法添加实现
  • 有几个独立的类,以及一个委托给这些类的“main”类,在一个单独的类中传递状态
  • 混合使用这两种方法(一些委托,一些继承)
你有别的办法吗?你认为什么最好(更容易执行/维护)?我相信这是很多人都有过的一个问题,因为“访客”是一种很常见的模式

一些私有字段(访问者修改/使用以执行其工作的状态)

听起来像是另一个课程,其中一些工作将被委派

一般来说,你最好寻找授权的机会


这对于访问者模式的存在并不是特别具体的,如果问题中没有更多细节,我们真的无法给出一个非常完整的答案。

从您的描述来看,访问者类似乎非常内聚(这很好:)。我唯一可以建议的是将翻译逻辑移动到IR,并成为向构建器发送命令的访问者(即Director角色)。在这种情况下,构建器将具有内部状态,从而利用访问者的负担

也许我遗漏了一些东西,但我不认为子类化在这里可以实现您的目的,所以我肯定会选择委托


HTH

没有更多的信息,很难判断。你能把范围扩大一点吗?假设visitor是变得太长的类,您能展示它实现的方法集吗?哪些是公共的,哪些是私人的?可能需要更多一些关于您正在映射的模型和映射本身的信息?对不起,我已经编辑了原始问题以添加关于模型和访问者本身的更多信息,这应该会有所帮助:)谢谢您的回答。对不起,我不知道我需要提供什么级别的详细信息,我已经编辑了原始问题。谢谢,这似乎是最好的解决方案,这样我可以选择如何在访问者和构建者之间分配复杂性。