我有一个由几个模块组成的游戏。
其中一个是数据库模块。 我想做到这样的事情:
Database{
public:
save(&Object); //all my classes in the all modules inherit from Object
load(&Object);
};
使该模块独立于其他模块的最佳方式是什么(其他模块将使用Database
和save
函数将数据存储在load
中?
我认为解决方案很少:
serialize()
方法的东西,它继承自Object
类(类似于Java)。 Database
使用该方法获取字符串并保存。明显的缺点是:所有对象都必须实现新方法,并且保存字符串不是最佳的(不知道类的结构)。Database
的文本文件)。这些清单将描述类的结构是什么(例如,一个字符串,两个double,一个罕见的使用int)。缺点是灵活性 - 更改其他模块中的类将影响清单。save
和load
方法,Database
使用它们。我不想要它,因为所有类都必须知道数据库类型,save
和load
应该在Database
类中,而不是在整个代码中分布(这是一个要点)制作这样的模块)。Database
了解所有其他模块(并且知道如何保存所有对象)。这里的坏事是很多依赖。任何模块的更改都会影响Database
。哪种方式会好?或者也许有更好的选择?
答案 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()
- 方法一次,以获得扩展的所有可能性。
优点:
缺点:
稍后,你可能会遇到你想要调用你不想序列化的对象的东西,然后将它分成一个 ISerializable 接口类是有意义的,只包含纯虚拟serialize()
- 方法。为了适应重要的序列化程序(如调试序列化程序),您可能希望改为void onInt(const char* name, int value)
等。
HTH