首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对称访问者模式

对称访问者模式
EN

Stack Overflow用户
提问于 2012-08-18 23:23:54
回答 2查看 196关注 0票数 2

我正在使用访问者模式在一些类上定义一组操作。

一些操作是可交换的,所以我最终在访问者模式代码中出现了重复。

假设我有类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调用的所有已实现的函数做一个第三个文件,这看起来不是很面向对象。

你将如何解决这个问题?

谢谢

(我可以列出一些代码,但它很长,并且不容易说明这一点)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-18 23:30:51

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

一种更好的方法是在助手类中实现“对称”操作,或者作为顶级函数实现,这取决于您的语言支持什么,然后让A*BB*A都调用该助手实现。

票数 4
EN

Stack Overflow用户

发布于 2012-08-18 23:42:26

我的建议是使用构建器,它将充当参数构建器

代码语言:javascript
复制
new ParameterBuilder()
    .setFirst( "A" )
    .setSecond( "B" )
    .setThird( "C" )
    ...
    .build();

那么你将只有一个以ParameterBuilder为参数的方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12019757

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档