我正在使用访问者模式在一些类上定义一组操作。
一些操作是可交换的,所以我最终在访问者模式代码中出现了重复。
假设我有类A,B,C,操作: 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调用的所有已实现的函数做一个第三个文件,这看起来不是很面向对象。
你将如何解决这个问题?
谢谢
(我可以列出一些代码,但它很长,并且不容易说明这一点)
发布于 2012-08-18 23:30:51
您是对的,您绝对应该避免将A*B实现为对B*A的调用。除了可能创建无限的调用链之外,这种方法并不反映代码中操作的对称性,因为代码是不对称的。
一种更好的方法是在助手类中实现“对称”操作,或者作为顶级函数实现,这取决于您的语言支持什么,然后让A*B和B*A都调用该助手实现。
发布于 2012-08-18 23:42:26
我的建议是使用构建器,它将充当参数构建器
new ParameterBuilder()
.setFirst( "A" )
.setSecond( "B" )
.setThird( "C" )
...
.build();那么你将只有一个以ParameterBuilder为参数的方法。
https://stackoverflow.com/questions/12019757
复制相似问题