2015-10-30 36 views
4

最近我讀了leveldb的源代碼,但我對錶和table_builder源代碼中的rep結構感到困惑。爲什麼table和tablebuilder在leveldb中使用struct rep?

因爲我們可以直接將成員變量直接存儲在類Table和類TableBuilder中。

但爲什麼筆者做一個結構衆議員,以及成員變量存儲在結構

我可以來衆議員起來絲毫的原因之一,因爲表和table_builder將暴露給用戶,所以我們要隱藏了實現。 是不是?還是有一些其他的想法,我想念,或者它是一些設計模式?

謝謝

回答

4

這裏是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庫。因此,這個習慣用法對於圖書館開發者來說是非常重要的,並且也可以用來最小化程序的不同模塊之間的耦合。

相關問題