条款23:宁以no-member、no_friend替换member函数

来源:互联网 发布:淘宝官方下载电脑版 编辑:程序博客网 时间:2024/04/30 11:59
条款23:宁以no-member、no_friend替换member函数
       书中提出一个例子:class表示网页浏览器,现在要写一个函数用来清除浏览器的高速缓存区、URLs、cookies。
class WebBrowser{public:void clearCache();void clearHistory();void removeCookies();};
提供一个删除接口,统一调用这些函数,于是我们在类中新增一个member函数
class WebBrowser{public:void clearEverything(){this->clearCache();this->clearHistory();this->removeCookies();}};
而这也可以通过non-member-and-non-friend函数替代
void clearBrowser(WebBrowser& wb){wb.clearCache();wb.clearHistory();wb.removeCookies();}
在member function 和 no-member-no-friend function 中如何抉择呢?     
        面向对象守则要求数据应该尽可能被封装,member函数带来的封装型比non-member函数低。此外,提供non-member函数可允许对WebBrowser相关机能有较大的包裹弹性,而那最终导致较低的编译相依度,增加webBrowser的伸缩性,因此,在许多方面non-member做法比member做法好。
       封装意味着不可见。愈多东西被封装,愈少人看到,愈大的弹性去变化,因为我们的改变仅仅直接影响到改变的那些人事物。愈多东西被封装,我们改变那些东西的能力就愈大。这就是我们推崇封装的原因:它使我们能够改变事物而只影响有限客户。
       对应对象内的数据,俞少看到数据(访问它),俞多的数据可得到封装,我们就俞能自由改变对象的数据。
namespace
       如何将类和no-member 函数整合在一起呢?我们的做法一般是将两者放在同一个namespace中。
namespace WebBrowserStuff{class WebBrowser{};void clearBrowser(WebBrowser& wb);}
       namespace的作用域可以跨越多个头文件,对于WebBrowser这样的类,应该存在很多便利的函数,即no-member-no-friend函数。为了降低编译关联性,可以将不同种类的函数定义在不同的头文件中,通过namespace实现。这样客户可以很轻松扩展这一组便利功能。
//webbrowser.hnamespace WebBrowserStuff{class WebBrowser{    //核心机能,例如几乎所有客户都需要的non-member函数。};void clearBrowser(WebBrowser& wb);}//webbrowserbookmark.hnamespace WebBrowserStuff{    //定义与书签相关的便利函数}//webbrowsercookies.hnamespace WebBrowserStuff{    //与cookie相关的便利函数}

记住
       宁以non-member-and-non-friend函数替换member函数,这样做可以增加封装性,包裹性和机能扩充性。

0 0
原创粉丝点击