C++之宁以non-member,non-friend替换member函数(23)---《Effecive C++》

来源:互联网 发布:盘点2016年网络流行语 编辑:程序博客网 时间:2024/05/16 14:59

条款23:宁以non-memebr、non-friend替换member函数

我们先来看看如下代码:

class WebBrowser{public:    ...    void clearCache();    void clearHistory();    void removeCookies();    ...};

如果我们想要清除浏览器中所有的Cache,cookie和history等,我们可以选择如下两种办法解决:
1)在class中声明一个mermber函数执行:

class WebBrowser{public:    ...    void clearEverything();    ...};

2)声明一个普通的non-member函数调用适当的member函数执行:

void clearBrowser(WebBrowser& wb){    wb.clearCache();    wb.clearHistory();    wb.removeCookies();}

这时候就有一个问题了,到底是member函数clearEverything还是non-member函数clearBrowser?

面向对象守则要求数据尽可能被封装,然而与直观相反地,member成员函数clearEverything的封装性比non-member成员函数的封装性低,同时,提供non-member成员函数可允许对WebBrowser相关技能有较大的弹性,因此很多方面我们选用non-member函数,下面我们来分析一下原因。

我们知道,关于封装,越少的函数可以访问类数据,那么类的封装性越好,如果在member函数和non-friend non-member成员函数之间做出选择的话,推荐使用non-friend non-member函数,因为它并不增加“能够访问class内中private成分”的函数数量,具有更大的封装性,注意这里是member成员函数和non-member non-friend函数之间选择;

注意:这里我们需要注意为了封装性而让函数“成为class的non-member”,并不意味这它“不可以是另一个class的member”,例如我们可以令clearBrowser成为某工具类的一个static member函数,只要他不是WebBrowser的一部分(或者其friend),就不会影响WebBrowser的private成员封装性。

更普遍的做法是让clearBrowser成为一个non-member函数并且位于WebBrowser所在的同一个namespace内,这样可以带来很多好处,例如namespace可以跨越多个源码文件而class不能。在C++中我们通常将这些辅助函数凡在多个头文件内但隶属与同一个命名空间,意味着客户可以轻松扩展这一组辅助函数,只需添加更多non-member non-friend函数到这个命名空间即可。

nameSspace WebBrowserStuff{    class WebBrowser{...};    void clearBrowser(WebBrowser& wb);}

总结:
宁可拿non-member non-friend函数替换member函数,这样可以增加封装性、可扩展性,具有很大的优势!

阅读全文
0 0
原创粉丝点击