时间:2021-07-01 10:21:17 帮助过:5人阅读
属性(Property)做好后,就到了模式(Schema)了。其实模式仅仅是属性的封装,属性写的稳健的话,模式做起来会轻松很多。
因为我是一点点的写的代码,写之前也没有做太多架构方面的东西(毕竟小程序),所以经常会有修改。基本上从周一改到了今天,接口方面改的还不是特别的多,但实现方面确实几经周折。
我在写模式的时候,考虑最多的也就,2件事情:1,在设计层面,模式应该包含哪些内容(当然主要是属性),又有哪些类需要用到模式(以及怎么使用它);2,模式在内存、硬盘中都是以何种方式进行存储的。最早的时候我是设想的在内存里以List去维护模式中的属性,也就是动态大小,但这显然没必要,毕竟一个模式基本上是不允许修改属性个数的。所以后来干脆以数组来维护了。
另外就是如何设置属性了。最终的版本其实还是应该以传统的数据库指令的方式,如"Create Schema ..."的方式,但现在若是要去实现一个命令解析器则明显不显示,所以就用了一个临时的解决方案,即SetProperty(int nPrptyIndex, LzjProperty *pPrpty),来一个个的手工指定。
差不多就是这些了,看代码吧。
// 模式,元数据,即metadata
/* 一个元数据在硬盘中的结构:
part1: m_strSchemaName
part2: 本metadata的字节数(为part1、part2、part3的加总),本Schema的属性数
part3: m_propertyList
*/
class LzjSchema{
private:
// void Init(DWORD dwNumPrpty);
public:
LString m_strSchemaName; // 本模式的名称
// LList<LzjProperty*> m_propertyList; // 该模式的属性。m_propertyList还是保存指针吧,至少不用处理【拷贝构造函数、operator=】之类的问题了。暂时以这种方式处理吧,后期还是要改为ParseCmd的
DWORD m_dwNumPrpty; // 本模式中的属性个数
Ptr_LzjProperty *m_propertyArr; // [本数组中的每个元素]均指向一个LzjProperty
public:
LzjSchema();
LzjSchema(LString strSchemaName);
~LzjSchema(); // 删除本模式中的所有属性
void ParseCmd(LString *pStrCmd); // 后期还是要改为此一形式,即通过命令行来定义模式
// void AddProperty(LzjProperty *pPrpty); // 向本对象中添加属性
void SetNumPrpty(DWORD dwNumPtpy); // 设置本对象的属性个数
void SetProperty(int nPrptyIndex, LzjProperty *pPrpty); // 设置本对象的属性
LzjProperty::LP_ValueType GetPrptyType(int nPrptyIndex);
DWORD GetNumPrpty();
DWORD Serialize(LFile *pFile); // 序列化,即:将本对象保存在文件中
DWORD Unserialize(LFile *pFile); // 反序列化,即:从文件中恢复本对象
void ConsoleOut(std::ostream *pCout);
};
从零开始实现一个最简单的数据库_Step2:Schema
标签: