【 在 Riverwind 的大作中提到: 】
: 主要想研究一下实现方案,
: 最近在扒拉UE4 C++的实现,魔法代码太多,简直脑壳疼
: qt虽然也是魔法代码,但好歹长的更像通常C++。
: ...................
反射不行,我搞了个映射。就是对结构自己写一个映射模板,相应的一套程序库,完成泛型的序列化/反序列化操作和ORM(Object Relational Mapping)操作。适用于C/C++。
模板可以手写,半自动生成,和利用数据库表自动生成。
加一下QQ群,SDBC。从文件区下载源码和文档即可使用。具体用法在群里讨论。原理很简单,不烧脑。
八、泛型和模板:
SDBC在网络传输和数据库存取中,需要把用户数据(struct,结构体)转换成字符串、JSON等格式(序列化)或反之,也需要把它们或它们中的部分数据存入数据库(insert,update),或从数据库中的一个表、一组关联的表中的全部或部分数据取出到结构。SDBC提供各种通用的函数处理这些问题。应用的数据结构,是根据用户需求定义的,SDBC的那些通用函数并不知道被处理的数据是怎样定义的,这就涉及一个问题:泛型处理。这里的‘泛’就是指广泛的,通用的。与之相对的就是‘特’,特殊的,特定的,专用的。说到泛型处理,人们自然想到C++的STL。STL提供一些通用的对象来处理通用的问题,它通过模板对通用对象进行定义和声明,你可以把自定义的数据类型提交给它处理。非常可惜,STL只处理‘泛’数据,对‘特’数据只处理它的指针,对其内容一无所知而无法处理。如果你一定要他处理‘特’数据,你就要提供一组‘特’函数给它,这个‘特’数据最终还是你自己处理的。因此,STL的模板我们称之为‘泛模板’。SDBC遇到的问题是,每一个‘泛’函数要处理‘特’数据,如果对每个‘特’数据编写一组‘特’函数,显然繁琐而无意义。它采用的方法是,为每一个‘特’数据编写一个‘特’模板,由‘泛’函数根据‘特’模板来处理‘特’数据。由于C语言的结构(struct)在运行时是无法解析的,所以需要采用模板来说明结构里的内容。与STL的‘泛模板’相对,SDBC的模板也可以称为‘特模板’。为每个数据结构写模板,是个繁琐而易错的工作,SDBC提供了一组工具帮助应用开发人员,可以从数据库表结构自动生成结构和模板的定义,还可以写一个简单的元数据文件来生成结构和模板的定义。将来也可能将‘泛模板’和‘特模板’结合起来使用,使泛型编程更加方便实用。
常用的泛型系统还有google的protobuf系统,它实际上是一个可反射的对象Message,它可以认为是个‘泛’结构,你必须在应用中使用Message对象进行数据处理和数据存储,它负责将Messge进行序列化和反序列化,可用在网络传输数据处理中,但目前还不能与关系数据库互相映象。而SDBC模板系统在任何系统和任何编译环境下,使用普通的,原生态的(不得进行pack指定,不得由编译器优化结构布局)结构,这使得应用程序最方便、快捷的处理自己的数据(经过pack的结构在很多CPU架构下不能正常使用)。
在此基础上,SDBC提供了数据库包装器,支持多种主流关系数据库的映象(其他各种数据库的映象机制也不难编写)。使应用程序能够更方便可靠高效率的使用数据库。目前支持ORACLE、DB2、MYSQL,其高级包装器DAU(Data Access Unit)功能极大的简化了数据库操作,并使运行效率接近系统极限。对SYBASE部分支持(采用CT-LIB,也具有简化开发的能力,支持自愈式连接池,支持程序柔性化,但暂时没有DAU功能)。这个包装器有助于应用程序的适应性,就是在用户需求不断变化,甚至数据结构不断变化时,你的应用程序只需极少的变化或不变化,我们称之为程序柔性化。当然如果你不使用包装器,SDBC支持你原生态的使用任何数据库。
在SDBC库中,pack目录下提供了基本数据映象的泛型方法,dau目录下提供高级数据映象的泛型方法(SRM和DAU)。
--
修改:ylh1969 FROM 221.221.50.*
FROM 221.221.50.*