這裏是table.h
提取的代碼片段,並從table_builder.h
一個代碼片斷將都表現出了類似的設計
class Table
{
...
struct Rep;
Rep* rep_;
...
};
因此,你想出的解釋是正確的之一:
- 類
table.h
的聲明和table_builder.h
暴露於leveldb
客戶;
- 但是,設計者不想公開數據的內部表示,因爲它們是實現細節,在接口中是不必要的;
- 因此,這些細節已被移出到單獨的結構中,結構
Rep
在公共接口(頭文件)中聲明,但僅在實現文件(源文件)中定義和使用;
- 這是一個相當常見的習慣用法,通常稱爲pImpl idiom(因爲指向實施通常被稱爲
pImpl
)或compilation firewall。
除了設計封裝外,這個習語還有另一個原因,這是可用性。事實上,如果Table
的內部細節暴露在Table.h
中,則每次這些細節更改時,包含Table.h
的任何leveldb用戶源文件都必須重新編譯。
通過隱藏這些實現細節,leveldb用戶的源文件不受leveldb數據內部表示的更改影響。只要leveldb公共接口(公共頭文件)不更改,用戶就可以從一個版本的leveldb升級到另一個版本,而無需重新編譯它們的源代碼:它們只需要鏈接到新版本的leveldb庫。因此,這個習慣用法對於圖書館開發者來說是非常重要的,並且也可以用來最小化程序的不同模塊之間的耦合。