最近,我阅读了leveldb的源代码,但是我对table和table_builder源中的rep struct感到困惑。
因为我们可以直接将成员变量直接存储在Table类和TableBuilder类中。
但是为什么作者要创建一个结构Rep,并将成员变量存储在该结构Rep中。
我可以提出一个原因,因为table和table_builder会向用户公开,所以我们要隐藏实现。
这样对吗?还是我想念了其他想法,或者是某种设计模式?
谢谢
最佳答案
这是从table.h
中提取的代码片段,而从table_builder.h
中提取的代码片段将显示类似的设计
class Table
{
...
struct Rep;
Rep* rep_;
...
};
因此,您提出的解释是正确的:
table.h
和table_builder.h
的声明向leveldb
客户端公开。 Rep
在公共(public)接口(interface)(头文件)中声明,但仅在实现文件(源文件)中定义和使用。 pImpl
)或compilation firewall。 除了设计封装,这种习惯用法还有另一个原因,就是可用性。实际上,如果
Table
公开了Table.h
的内部详细信息,则每次更改这些详细信息时,都必须重新编译任何包含Table.h
的leveldb用户源文件。通过隐藏这些实现细节,leveldb用户的源文件不受leveldb数据内部表示形式的更改的影响。只要leveldb公共(public)接口(interface)(公共(public)头文件)没有变化,用户就可以从一个版本的leveldb升级到另一个版本,而无需重新编译其源代码:他们只需要链接到新版本的leveldb库即可。
因此,这种习惯用法对于库开发人员而言极为重要,并且也可以用于使程序的不同模块之间的耦合最小化。
关于c++ - 为什么leveldb中的表和tablebuilder使用struct rep?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33427916/