分类目录归档:未分类

应该用bind+function取代虚函数吗?

用bind+function取代虚函数在好几年前就有人提出了,曾引起广泛的讨论,有支持的有反对的,可能赞成的人占大多数。这个话题挺有趣,本来是作为技术沙龙的开放性话题来讨论的,由于时间关系并没有讨论。今天就来具体探讨一下这个问题,我将做两个实验来验证一下这两种做法,具体是实现两个模式:策略模式和责任链模式。我将分别用经典的虚函数和bind+function来实现这两个模式。通过这两个实验来得出我的结论。

实验一:策略模式的实现

1.虚函数方式实现策略模式

2.bind+function方式实现策略模式

测试代码:

bind+function取代虚函数的一个重要理由是虚函数带来了效率损失,bind+function效率更高,我做了一个性能测试, 分别调用10000000次来看耗时,发现虚函数比bind+function方式要快一些,无论是用标准库的bind还是boost的bind,都比虚函数方式要慢,所以说bind+function比虚函数性能更好是想当然,站不住脚的。接下来看第二个实验。

实验二:责任链模式的实现

1.虚函数方式实现责任链模式

2.bind+function方式实现责任链模式

测试代码:

bind+function实现责任链模式的关键代码在这里:

这几行代码通过assemble不断地往function链条中加function,最后调用的时候会从链条的第一个function开始调用。

bind+function取代虚函数的另外一个理由是松耦合,去除了继承的限制,方法的实现更加灵活,确实,低耦合确实是bind+function最大的优点,然而这个最大的优点也成了它最大的缺点,当需要替代的虚函数增多时,组装function的复杂度也在增加,太松散了导致代码也不够直观,代码的内聚性也变低了。比如上面责任链模式的实现,虚函数的实现明显比bind+function的实现要优雅。

结论

bind+function相比虚函数的实现在性能上并不占优,最大的优点是大大降低类之间的耦合度,缺点是太过于松散导致代码的内聚性和可读性降低。

bind+function适用的场景:

1.迫切需要接口和实现解耦;

2.需要解耦的接口很少。

满足这两种情况适合用bind+function,否则还是用虚函数更好。

C++技术沙龙报名啦!

沙龙主题:C++魔法
关键字:C++之美,黑科技,神奇和魔力
内容:三场主题演讲和一场开放性话题讨论
时间:2015年5月16日下午2:00-6:00
地点:珠海金山办公软件1楼VIP厅,珠海市吉大景山路莲山巷8号金山软件大厦
参与方式:邀请和报名。报名方式:填写报名信息。

品c++甜点,喝下午茶,论编程之道。
探bit奥秘,舞动指尖,写程序诗篇。

报名需知:请填写真实的电话和姓名,以便我们联系您。入场的时候请携带身份证,验证身份证是为了防止猎头进入,望大家理解。这是一场纯粹的技术盛会!限定名额为40人,报满为止。

QQ图片20150508161749

liantu

 

Copy Protected by Chetan's WP-Copyprotect.