为什么leveldb中的表和表生成器使用structrep

why table and tablebuilder in leveldb use struct rep?

本文关键字:structrep leveldb 为什么      更新时间:2023-10-16

最近我读了leveldb的源代码,但我对表中的rep结构和table_builder源代码感到困惑。

因为我们可以直接将成员变量存储在类Table和类TableBuilder中。

但是为什么作者制作了一个结构Rep,并将成员变量存储在结构Rep中。

我可以提出一个原因,因为表和table_builder将向用户公开,所以我们希望隐藏实现。对吗?或者我错过了其他一些想法,或者是一些设计模式?

感谢

以下是从table.h中提取的代码片段,而从table_builder.h中提取的一个代码片段将显示类似的设计

class Table 
{
    ...
    struct Rep;
    Rep* rep_;
    ...
};

因此,你提出的解释是正确的:

  • table.htable_builder.h的声明被公开给leveldb客户端
  • 然而,设计者不想公开数据的内部表示,因为它们是实现细节,在接口中是不必要的
  • 因此,这些细节被移到了一个单独的结构中,即结构Rep,它在公共接口(头文件)中声明,但仅在实现文件(源文件)中定义和使用
  • 这是一个相当常见的习惯用法,通常称为pImpl习惯用法(因为指向实现的指针通常称为pImpl)或编译防火墙

除了设计封装之外,这个习惯用法还有另一个原因,那就是可用性。事实上,如果Table的内部细节在Table.h中公开,那么每当这些细节发生变化时,任何包含Table.h的leveldb用户的源文件都必须重新编译。

通过隐藏这些实现细节,leveldb用户的源文件不受leveldb数据内部表示形式更改的影响。只要leveldb公共接口(公共头文件)不变,用户就可以从leveldb的一个版本升级到另一个版本,而无需重新编译源代码:他们只需要链接到leveldb库的新版本。

因此,这个习惯用法对库开发人员来说非常重要,也可以用来最小化程序中不同模块之间的耦合。