Effective C++ 第二十三條 Prefer non-member non friend functions to me
寧以 non-member non-friend 函數(shù)替換 member 函數(shù)
下面有實(shí)例,三個(gè)對(duì)瀏覽器的操作
現(xiàn)在需要一個(gè)函數(shù)合并三個(gè)操作,有兩種選擇,一種是 member 另一種是 non-member non-friend
前面學(xué)過(guò),面向?qū)ο笫貏t要求數(shù)據(jù)應(yīng)該盡可能被封裝,如果使用 member 函數(shù) clearEverything 那么封裝度其實(shí)低于 non-member non-friend 函數(shù) clearBrowser。non-member non-friend 函數(shù)的編譯相聯(lián)度更低,越多的內(nèi)容被封裝,能被看見(jiàn)的東西就越少,我們就能夠越自由的改變內(nèi)容(由條款22可知)。member 函數(shù)可以使用 private 函數(shù)、enums、typedefs,但是 non-member non-friend 函數(shù)就不能,二者提供的功能相同,non-member non-friend 不會(huì)增加 class 內(nèi) private 成分的函數(shù)數(shù)量,所以 non-member non-friend 使得 WebBrowser 具有更好的封裝性。這點(diǎn)要區(qū)分清楚,non-member non-friend 而不是 non-member ,因?yàn)?friend 函數(shù)同 private 函數(shù)一樣可以調(diào)用 private 函數(shù)、enums、typedefs,不能增加封裝性。
使用 ?non-member non-friend 還有一個(gè)好處,可以降低編譯相依關(guān)系,比如本案例中三個(gè)函數(shù),我只需要使用其中一個(gè),但是 class 中的函數(shù)會(huì)整體定義,無(wú)法分割。non-member non-friend 可以按照如下方式分割:
可以按照 namespace 分離到三個(gè)文件,假如我只需要使用 cookie 的內(nèi)容,我就只需要包含file 1 和 file 2 頭文件,不需要包含 file 3. STL 標(biāo)準(zhǔn)庫(kù)就是如此,我不需要 list 我就不 #include <list>, 我需要 vector 我就 #include <vector> , 二者都在 std 空間下,可以做到分離使用。因此,class 的使用對(duì)于客戶來(lái)說(shuō)不可拓展,即使客戶能夠通過(guò)繼承來(lái)產(chǎn)生 Derived,但是無(wú)法訪問(wèn) Base 中被 private 修飾的成員,擴(kuò)展性就差了許多。