原則31:將文件間的變異依存關系降至最低

這個原則著重講述的是編譯的依存關系,篇幅很長,理解起來也比較費勁。
這個原則是針對什么問題而提出來的呢?有的時候你在一個大工程里,你就修改了某個類中的一小部分實現,甚至就是一條語句,結果整個工程各種莫名其妙的錯誤出現了,然后你崩潰了。
作者說這是由于沒有把接口從實現中分離造成的,那這又是什么意思呢?從作者所舉的例子Person類來看,它的私有成員里面有很多其他類的對象,而這些對象又是Person類中某些函數的參數,如下圖所示:


1.png

從這圖可以看出作者所說的實現也就是私有成員中所列的這些東西,而它們又是其他類的對象。那既然用到了其他類那必須要引用其他類的頭文件啊,就是使用#include命令。這樣的話就形成了一定的編譯依賴關系,這名詞還是很有學術氣息的。那形成編譯依賴關系又能怎么樣?那可以用一句話來概括——牽一發而動全身。
作者接著引用了一種慣常的思維,既然你說不要把實現和接口摻和在一起,那你就不實現唄,讓那些被引用的類也只不過是類的聲明而已不就得了,讓后把它們一塊放在命名空間里面。這種類的聲明叫做前置聲明。這樣做的好處就是實現不會動,會動的只能是接口,那么用戶只需要在接口被改動之后重新編譯即可。
不過上面這種辦法純屬扯淡!因為編譯器必須知道編譯期間某個對象的大小,編譯器只能通過類的定義才能知道這個對象需要多大空間,現在你就給了一個聲明,編譯器哪知道那個對象到底需要多大地方?!在這一點上C++和Smalltalk,Java還是有區別的,因為后兩者只提供指向類的指針,而指針大小是固定的。
于是乎得出了一種常用的設計方式,那就是接口和實現分離,再具體點就是一個類提供接口,另一個類提供實現。而接口類和實現類中連接的紐帶就是一個作為指向實現類的私有智能指針。這種設計一般被稱為pimpl(pointer to implementation)。
它體現的思想是使用生命的依存性去替換實現的依存性,這是編譯依存性最小化的本質體現。
很奇怪,你僅僅是聲明一個類,你就能用這個類定義一個形參并且放在函數形參列表中。其實還是那種情況,你只需要在用到定義的時候才真正去暴露類的定義,函數也是同理,所以你可以看到某個頭文件中有很多聲明式包括函數的和類的。那么你也會看到我經常把類和函數的聲明的放到頭文件中去,而把實現放到CPP中去。這樣做的目的是降低與實現文件之間的編譯依存關系。
作者還提到有些泛型類也是采用實現和聲明分離的設計方式的,不過要使用關鍵字export,可是這一關鍵字已經很少出現在當代編譯器當中了,所以我所見到的泛型都是實現和生命合而為一的。
從下面這個代碼段可以看出在構造函數的形參列表中類的對象是可以new的,如下圖所示:



另一種pimpl實現手段是寫一個C++的interface,里面是virtual函數和pure virtual虛擬函數,當然interface里面可以含有成員變量,但是人們通常不那么做,因為就好像它的名字那樣interface只是接口,而接口是供別人調用用的,所以它里面只需要函數足矣。Interface肯定是要被繼承的,否則它啥用都沒有,尤其是內涵pure virtual的interface。這個實現的任務就交給了它的子類,在這個interface中有那么一個函數,它的作用是返回一個已經實例化的對象的指針。這個函數被稱為factory函數或者virtual構造函數,當然后者并不是說構造函數可以virtual。這些做法都是基于內聯實現的。
上述這些做法多多少少會帶來效率的低下。
總結一下作者的思想就是:
1、依賴于聲明式,使用pimpl模式進行設計都會減小編譯依存性。

2、頭文件應該只包含聲明。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,619評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,155評論 3 425
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,635評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,539評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,255評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,646評論 1 326
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,655評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,838評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,399評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,146評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,338評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,893評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,565評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,983評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,257評論 1 292
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,059評論 3 397
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,296評論 2 376

推薦閱讀更多精彩內容