条款23:宁以non-member, non-friend,替换member函数。

考虑下面这种经常出现的使用方式:

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

那么很自然的就会想到增加这么一种清理方式:

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

或者是这么一种清理方式:

void clearBrowser(WebBrowser & wb)
{
    wb.clearCache();
    wb.clearHistory();
    wb.clearCookie();
}
如果要在功能相同的一个member function和一个non-member, non-friend function之间选的话,那么具有较高的封装性的是non-member, non-friend function.
(注意这里的在意封装性,让一个function成为一个class的non-member),不影响其成为另一个class的member函数,例如上面的clearBrowser函数来说,其完全可以作为某个工具类的static member函数)
一般的好的做法是让,clearBrowser放置在与clss WebBrowser相同的一个namespace里面。像下面这样:
namespace WebBrowserStuff{
    class WebBrowser{...};
    void clearBrowser(WebBrowser & wb);//类似clearBrowser这类的便利函数可以在一个namespace里面声明多个。
};
而且由于namespace可以跨头文件存在,这样也方便这类的工具函数进行跨头文件的维护。
 
小结:
    记住应该用non-member non-friend函数替换member函数,这样做可以增加封装性,包裹弹性以及机能扩充性质。
posted @ 2015-10-07 22:40  eversliver  阅读(281)  评论(0编辑  收藏  举报