我正在使用访问者模式在某些类上定义一组操作。
有些操作是可交换的,所以我最终会在访问者模式代码中出现重复。
假设我有 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 调用的所有已实现函数的第三个文件,这似乎不是非常面向对象的。
你会如何解决这个问题?
谢谢
(我可以列出一些代码,但它很长并且不容易说明这一点)
问问题
202 次
2 回答
4
你是对的,你绝对应该避免A*B
作为B*A
. 除了可能创建无限的调用链之外,这种方法不会反映代码中操作的对称性,因为代码不是对称的。
更好的方法是在辅助类中实现“对称”操作或作为顶级函数,具体取决于您的语言支持的内容,然后进行两者A*B
并B*A
调用该辅助实现。
于 2012-08-18T15:30:50.823 回答
1
我的建议是使用 builder 作为参数 Builder
new ParameterBuilder()
.setFirst( "A" )
.setSecond( "B" )
.setThird( "C" )
...
.build();
那么你将只有一种方法ParameterBuilder
作为参数。
于 2012-08-18T15:42:26.463 回答