数据库模块摘要(独立)来自游戏的其他模块

时间:2012-12-04 22:10:22

标签: c++ database module dependencies

我有一个由几个模块组成的游戏。

其中一个是数据库模块。 我想做到这样的事情:

Database{
    public:
        save(&Object); //all my classes in the all modules inherit from Object
        load(&Object);
};

使该模块独立于其他模块的最佳方式是什么(其他模块将使用Databasesave函数将数据存储在load中?

我认为解决方案很少:

  1. 所有对象都有类似serialize()方法的东西,它继承自Object类(类似于Java)。 Database使用该方法获取字符串并保存。明显的缺点是:所有对象都必须实现新方法,并且保存字符串不是最佳的(不知道类的结构)。
  2. 为所有类制作“清单”(例如,将发送到Database的文本文件)。这些清单将描述类的结构是什么(例如,一个字符串,两个double,一个罕见的使用int)。缺点是灵活性 - 更改其他模块中的类将影响清单。
  3. 所有类都有自己的saveload方法,Database使用它们。我不想要它,因为所有类都必须知道数据库类型,saveload应该在Database类中,而不是在整个代码中分布(这是一个要点)制作这样的模块)。
  4. Database了解所有其他模块(并且知道如何保存所有对象)。这里的坏事是很多依赖。任何模块的更改都会影响Database
  5. 哪种方式会好?或者也许有更好的选择?

1 个答案:

答案 0 :(得分:0)

我遇到的一个解决方案是让所有Object子类实现virtual void serialize(ISerializer& serializer)方法。

ISerializer 将具有纯void onInt(int value)void onString(const char* string)等虚拟方法,可由其serialize() - 方法中的Object子类调用。您的数据库模块可以在两个单独的类中实现 ISerializer DatabaseReader DatabaseWriter 。稍后您可以添加 ObjectInspectionFileDumper OnScreenObjectStateDebugger NetworkWriter ,它们也会实现 ISerializer ,但在其他模块中。每个对象只需要实现serialize() - 方法一次,以获得扩展的所有可能性。

优点:

  • 只要你没有在没有某种版本控制方案的情况下读取旧版本对象的数据,读取和写入就可以保证匹配。
  • 这是一种正交设计,其中Object类型和Serializer类型的数量可以相互独立地增长。

缺点:

  • 主要是一些虚拟功能开销,如果这是您项目的问题。这不是你在常规游戏过程中通常会做的事情。

稍后,你可能会遇到你想要调用你不想序列化的对象的东西,然后将它分成一个 ISerializable 接口类是有意义的,只包含纯虚拟serialize() - 方法。为了适应重要的序列化程序(如调试序列化程序),您可能希望改为void onInt(const char* name, int value)等。

HTH