时间: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
标签: