2

我正在使用访问者模式在某些类上定义一组操作。
有些操作是可交换的,所以我最终会在访问者模式代码中出现重复。
假设我有 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 调用的所有已实现函数的第三个文件,这似乎不是非常面向对象的。
你会如何解决这个问题?
谢谢
(我可以列出一些代码,但它很长并且不容易说明这一点)

4

2 回答 2

4

你是对的,你绝对应该避免A*B作为B*A. 除了可能创建无限的调用链之外,这种方法不会反映代码中操作的对称性,因为代码不是对称的。

更好的方法是在辅助类中实现“对称”操作或作为顶级函数,具体取决于您的语言支持的内容,然后进行两者A*BB*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 回答