2015-10-30 24 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库。因此,这个习惯用法对于图书馆开发者来说是非常重要的,并且也可以用来最小化程序的不同模块之间的耦合。

相关问题