C++ 降低 Compilation Dependency
一個檔案 include 另一個檔案時,這兩個檔案便形成 compilation dependency。一個被 include 的檔案一旦修改,跟它有 compilation dependency 的檔案(無論直接或間接 include)都需要重新 compile。假設 A.h include B.h,當 B.h 改變或 B.h include 的檔案改變時,所有 include A.h 的檔案都需要重新 compile。
應該盡量降低 compile dependency,以減少修改一個 header 而需要重新 compile 的檔案數量,免得改個檔案全世界都要重新 compile。(工程師無數青春在哭泣)
原則上盡量以 declaration 的 dependency 取代 definition 的 dependency。
可以用 object pointer 或 object reference,就不要用 object。
可以在 class 裡宣告 pointer 或 reference 作為 member,就不要定義 object 當 member,因為定義 object 就需要該 class 的 definition。
分開 class 的宣告與實作
讓 include(提供 definition)可以從 header file 移到真正使用這些 class、function 的 cpp file。
Handle class
使用兩個 class,一個代表宣告,一個是真正的實作。前者通常稱為
Handle class
,只宣告 function 並有個 pointer 指向後者。外界使用 Handle class,而 Handle class 會轉 call 真正 implement 的 class 達到功能。這個方式用到第一點的概念──避免使用 object,改用 pointer。因為兩個 class 會有相同的 function,會造成同時 maintain 兩份類似 class 的問題。
Interface class(abstract base class)
interface class 沒有 member data、沒有 constructor,只有一 virtual destructor 跟一堆 pure virtual function。實作的 class 繼承 interface class 進行功能實作,以 virtual function 的機制讓外界用 interface class 的 pointer 使用。
這兩種方法的 trade off 是速度會慢一點、多用點 memory,不過普遍上來說好處比 trade off 重要。
Ref
- 《Effective C++》item 31