注册数据“块”的最佳设计模式是什么?

时间:2011-08-17 00:33:06

标签: c++ design-patterns serialization

我有一个可以保存/加载磁盘“块”的库,它是具有恒定大小和唯一静态CHUNK_ID字段的POD结构。所以负载看起来像是这样。

void Load(int docId, char* ptr, int type, size_t& size)...

如果要添加新块,只需使用新的CHUNK_ID添加struct,并使用Save Load函数。

我想要的是强制所有“块”具有PrintHumanReadable,CompareThisTypeOfChunk等函数(理想情况下程序不应该在没有这些函数的情况下编译)。此外,我想标记/注册/枚举所有块结构。

我有一些想法,但他们都有问题。

  1. 使用纯虚函数PrintHumanReadable,CompareThisTypeOfChunk创建基类。 问题:打破pod类型并需要重写库。
  2. 实现从CHUNK_ID创建块结构的工厂。问题:当我添加没有必需功能的新块时编译。
  3. 你能否为我的问题推荐优雅的设计解决方案?

2 个答案:

答案 0 :(得分:2)

实现一个简单的代码生成器。您可以使用Mako或Cheetah(两个Python库)之类的东西。创建一个包含所有类名的文本文件,然后让生成器构建工厂方法和一系列未实际使用但在所有类中引用所需方法的方法。这也可以直接枚举类(再次使用生成的代码)。

答案 1 :(得分:1)

适当的设计模式称为“使用Boost.Serialization”。它确实是将对象写入格式然后稍后再读取的最佳工具。它可以用文本,二进制甚至XML格式编写(如果你为它们编写适当的流,还可以写其他格式)。它可以是非侵入式的,因此您无需修改​​对象来序列化它们。等等。

一旦您使用适当的工具完成此工作,您就可以使用您喜欢的任何类层次结构或其他方法来确保对象的正确功能存在。

如果你不能/不会使用Boost.Serialization,那么你几乎就会遇到运行时解决方案。由于解决方案是运行时而不是编译时,因此无法在编译时确保任何特定的块ID具有必需的功能。