为什么leveldb中的table和tablebuilder使用struct rep?

时间:2015-10-30 02:54:13

标签: c++ design-patterns leveldb

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

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

但是为什么作者创建一个struct Rep,并将成员变量存储在struct Rep。

我可以提出一个原因,因为table和table_builder会向用户公开,所以我们想要隐藏实现。 这样对吗?还是有一些我想念的想法,或者是一些设计模式?

谢谢

1 个答案:

答案 0 :(得分:4)

以下是从table.h中提取的代码段,而来自table_builder.h的代码段会显示类似的设计

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

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

  • table.htable_builder.h的声明向leveldb客户提供;
  • 但是,设计人员不希望公开数据的内部表示,因为它们是实现细节,在接口中是不必要的;
  • 因此这些细节已经移出到一个单独的结构中,结构Rep在公共接口(头文件)中声明,但是只在实现文件(源文件)中定义和使用;
  • 这是一个相当常见的习惯用法,通常称为pImpl idiom(因为指向实现的指针通常称为pImpl)或compilation firewall。< / LI>

除了设计封装之外,这个成语还有另一个原因,即可用性。实际上,如果Table中的Table.h的内部详细信息已在Table.h中公开,则每次这些详细信息更改时,都必须重新编译包含$sql = "SELECT * FROM science"; $result = mysqli_query($conn, $sql); $no = mysqli_num_rows($result); $qu = $no / 25; $page = 0; while($page < round($qu)) { $page++; } $p = round($qu) - $page; if($p > 0 and $p < 0.5) { $page++; } while($PageNum < $page) { ?> <ul class='pageUl'> <li class='pages'><span class='spanPage' onclick='changeQ()'><?php $PageNum ?></span></li> <?php } echo "</ul>"; 的任何leveldb用户的源文件。

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

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