为什么leveldb中的表和表生成器使用structrep
why table and tablebuilder in leveldb use struct rep?
最近我读了leveldb的源代码,但我对表中的rep结构和table_builder源代码感到困惑。
因为我们可以直接将成员变量存储在类Table和类TableBuilder中。
但是为什么作者制作了一个结构Rep,并将成员变量存储在结构Rep中。
我可以提出一个原因,因为表和table_builder将向用户公开,所以我们希望隐藏实现。对吗?或者我错过了其他一些想法,或者是一些设计模式?
感谢
以下是从table.h
中提取的代码片段,而从table_builder.h
中提取的一个代码片段将显示类似的设计
class Table
{
...
struct Rep;
Rep* rep_;
...
};
因此,你提出的解释是正确的:
- 类
table.h
和table_builder.h
的声明被公开给leveldb
客户端 - 然而,设计者不想公开数据的内部表示,因为它们是实现细节,在接口中是不必要的
- 因此,这些细节被移到了一个单独的结构中,即结构
Rep
,它在公共接口(头文件)中声明,但仅在实现文件(源文件)中定义和使用 - 这是一个相当常见的习惯用法,通常称为pImpl习惯用法(因为指向实现的指针通常称为
pImpl
)或编译防火墙
除了设计封装之外,这个习惯用法还有另一个原因,那就是可用性。事实上,如果Table
的内部细节在Table.h
中公开,那么每当这些细节发生变化时,任何包含Table.h
的leveldb用户的源文件都必须重新编译。
通过隐藏这些实现细节,leveldb用户的源文件不受leveldb数据内部表示形式更改的影响。只要leveldb公共接口(公共头文件)不变,用户就可以从leveldb的一个版本升级到另一个版本,而无需重新编译源代码:他们只需要链接到leveldb库的新版本。
因此,这个习惯用法对库开发人员来说非常重要,也可以用来最小化程序中不同模块之间的耦合。
相关文章:
- 在 leveldb 的 c++ 示例中声明迭代器时出现分段错误
- 编译自定义咖啡层时,LevelDB 中出现一个奇怪的错误
- 如何在C 中的LevelDB中的put()方法的值参数中插入多个值
- 对 leveldb 选项的未定义引用
- 使用c++向量按索引查询是否比RocksDB或LevelDB中按键(索引)查询快
- 为什么这个 leveldb 代码会截断包含空格的"std::string"?
- LevelDB DeleteObsoleteFiles是私人的
- 编译 Caffe 时对 leveldb 的未定义引用
- leveldb 源代码,为什么 db_impl.cc 实现纯虚函数"DB::Delete"
- leveldb示例不适用于windows:错误LNK2029
- 通过LevelDB将协议缓冲区序列化数据从C++传递到Python
- 正在链接leveldb的包装类中的静态方法
- 为什么leveldb中的表和表生成器使用structrep
- LevelDB TEST_方法前缀
- leveldb中的整数值
- 如何按值排序LevelDB
- LevelDB vs. std::map
- LevelDB 在删除 LevelDB 实例时断言
- 为什么要在 levelDB 的缓存中使用 while 循环(函数 Resize)?
- Leveldb限制测试-限制程序使用的内存