0

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

其中之一是数据库模块。我想让它变成这样:

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

使该模块独立于其他模块Database的最佳方法是什么(其他模块将在使用save和功能中存储数据load)?

我考虑了几个解决方案:

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

哪种方式会好?或者也许有更好的选择?

4

1 回答 1

0

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

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

优点:

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

缺点:

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

稍后,您可能会遇到不想序列化的要调用 Objects 的东西,然后将其分离到仅包含纯 virtual 方法的ISerializable接口类中可能是有意义的serialize()。为了适应重要的序列化程序(如调试序列化程序),您可能需要改为void onInt(const char* name, int value)etc。

高温高压

于 2012-12-05T00:06:07.537 回答