我正在使用访问者模式在某些类上定义一组操作
有些操作是可交换的,所以我最终在访问者模式代码中重复
假设我有ABC类,操作:A * A,A * B,A * C,B * A,B * B,B * C,C * A,C * B,C * C. >
A * A,B * B,C * C是唯一的
A * B,B * A和朋友将有代码重复
我可以实现A * B,并使B * A调用A * B,但我最终会问自己:我在哪个文件中再次实现A和B之间的操作,在A或B中? (会有大约6个班级,所以我会问很多这个问题.15对可能的操作)
在实施新操作时,将来有人会冒A + B无限循环呼叫B * A呼叫A * B的风险。
有一个约定决定哪个应该实现A * B或B * A是不自然的
我可以创建一个第三个文件,其中包含所有已实现的函数,这些函数由A * B和B * A调用,看起来不是面向对象的。
你会如何解决这个问题?
由于
(我可以列出一些代码,但它很长,并没有很容易说明这一点)
答案 0 :(得分:4)
你是对的,你绝对不应该A*B
来实施B*A
。除了可能创建无限的调用链之外,该方法不会反映代码中操作的对称性,因为代码不是对称的。
更好的方法是在助手类或顶级函数中实现“对称”操作,具体取决于您的语言支持的内容,然后同时生成A*B
和B*A
称之为帮助实现。
答案 1 :(得分:1)
我的建议是使用构建器,它将作为参数构建器
new ParameterBuilder()
.setFirst( "A" )
.setSecond( "B" )
.setThird( "C" )
...
.build();
然后你将只有一个以ParameterBuilder
为参数的方法。