Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 注册数据的最佳设计模式是什么;块;?_C++_Design Patterns_Serialization - Fatal编程技术网

C++ 注册数据的最佳设计模式是什么;块;?

C++ 注册数据的最佳设计模式是什么;块;?,c++,design-patterns,serialization,C++,Design Patterns,Serialization,我有一个库,可以在磁盘上保存/加载“块”,这些块是具有恒定大小和唯一静态块ID字段的POD结构。所以负载看起来像这样 void Load(int docId, char* ptr, int type, size_t& size)... 如果要添加新块,只需添加具有新块ID的struct,并使用保存加载函数即可 我想要的是强制所有的“块”都有函数,比如PrintHumanReadable、CompareThisTypeOfChunk等(理想情况下,程序不应该在没有这些函数的情况下编译)。

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

void Load(int docId, char* ptr, int type, size_t& size)...
如果要添加新块,只需添加具有新块ID的struct,并使用保存加载函数即可

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

我有一些想法,但都有问题

  • 使用纯虚拟函数PrintHumanReadable、CompareThisTypeOfChunk创建基类。 问题:断开pod类型并需要库重写
  • 实现从chunk_ID创建chunk struct的工厂。问题:当我添加新chunk而没有所需函数时编译

  • 你能为我的问题推荐优雅的设计解决方案吗?

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

    一旦您为此作业使用了适当的工具,就可以使用任何您喜欢的类层次结构或其他方法来确保对象的适当函数存在


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

    这方面的正确设计模式称为“使用”。它确实是将对象写入格式,然后再将其读回的最佳工具。它可以以文本、二进制甚至XML格式编写(如果为它们编写适当的流,还可以编写其他格式)。它可以是非侵入性的,因此不需要修改对象来序列化它们。等等

    一旦您为此作业使用了适当的工具,就可以使用任何您喜欢的类层次结构或其他方法来确保对象的适当函数存在


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

    实现一个简单的代码生成器。您可以使用Mako或Cheetah(两个Python库)。生成一个包含所有类名的文本文件,然后让生成器生成factory方法和一系列方法,这些方法实际上没有使用,但引用所有类中所需的方法。这也使得枚举类变得简单(同样,使用生成的代码)。

    实现一个简单的代码生成器。您可以使用Mako或Cheetah(两个Python库)。生成一个包含所有类名的文本文件,然后让生成器生成factory方法和一系列方法,这些方法实际上没有使用,但引用所有类中所需的方法。这也使得枚举类变得简单(同样,使用生成的代码)。

    这些POD结构允许包含指针吗?POD与否对序列化没有帮助,因为您必须逐个成员序列化。那么,为什么不添加一个虚拟接口,强制客户机提供必要的功能呢?好的,我没有提到。它不仅是pod结构,而且是已知大小的结构。因此,无需编写特殊的序列化。在一个不完美的世界中,即使有两个约束也会使问题无法解决。我相信有了您的约束,如果不进行一些编译器修改,就无法解决这个问题。这些POD结构是否允许包含指针?POD与否并不能真正帮助您进行序列化,因为您必须逐个成员进行序列化。那么,为什么不添加一个虚拟接口,强制客户机提供必要的功能呢?好的,我没有提到。它不仅是pod结构,而且是已知大小的结构。因此,无需编写特殊的序列化。在一个不完美的世界中,即使有两个约束也会使问题无法解决。我相信如果没有编译器的修改,你的约束是无法解决的。正如我在问题中提到的,我已经有了一个searilization库,它被用于许多工具中。我也有这种格式的大型数据库。所以重写库和更改格式是相当昂贵的。@ton4eg:但这不是一个很好的方法(就它能处理的内容而言。也许你在重视其他品质)。否则,你就不会有问题了。大多数序列化库都可以处理您正在做的事情。除非您在库中实现了严格的序列化功能(即:不只是将结构爆破到文件),或者使用更好的序列化库,否则您的问题根本无法解决。您的序列化库是基于运行时的,因此在编译时无法验证它。我完全同意您的看法,但它是一个很难更改的遗留系统。我试图理解如何在不改变的情况下改进它。正如我在问题中提到的,我已经有了一个searilization库,它被用于许多工具中。我也有这种格式的大型数据库。所以重写库和更改格式是相当昂贵的。@ton4eg:但这不是一个很好的方法(就它能处理的内容而言。也许你在重视其他品质)。否则,你就不会有问题了。大多数序列化库都可以处理您正在做的事情。除非您在库中实现了严格的序列化功能(即:不只是将结构爆破到文件),或者使用更好的序列化库,否则您的问题根本无法解决。你的连载