APP下载

基于关系数据模型代码生成器的设计与实现

2010-11-26冉春娟黄华

湖北大学学报(自然科学版) 2010年2期
关键词:代码生成数据模型脚本

冉春娟,黄华

(武汉大学 计算机学院,湖北 武汉 430071)

近年来,企业或政府部门的核心业务大多通过管理信息系统MIS实现,MIS系统开发成为应用系统开发的主流.在当前计算机技术条件下,MIS系统大部分是构建在关系数据模型上,其系统的开发方法也有很多的相似性.通过考察基于主流开发平台(如Java与.Net)多层架构的程序实现代码,发现大量相似程序代码都与关系数据模型相关,根据所做的统计,其平均代码行数占到总代码行数的50%,有的甚至接近70%.如能以关系数据模型作为输入,自动生成相关程序代码,必将可以大大缩短MIS系统的开发周期,提高软件代码的质量,也可快速适应MIS系统频繁的需求变化.

1 现有代码生成技术分析

从现有的主流代码生成技术看,都采用了基于模板的方法,即以成功应用的程序代码作为蓝本,将其中固定不变的部分作为静态代码框架部分,将其中需要变化的部分通过结合一定的标记或生成语言改写为可动态替换的脚本,从而构成代码模板文件,再结合生成工具同数据源相作用,生成实际的程序代码[1].尽管原理相似,但不同的代码生成工具在具体实现技术上却不尽相同,概括起来分为两种类型:内置模板型和可定制模板型.(1)内置模板型:代码的模板与生成工具是一体的,模板的格式和内容都隐含在生成工具中,不能定制.这一类的生成工具如动软.Net代码生成器,JAG-Java代码生成器等.(2)可定制模板型:代码的模板与生成工具分离,代码生成工具提供一种标记语言作为模板的编写规则.用户可通过标记语言编写代码模板,从而满足不同应用平台和应用环境的需要.这一类的生成工具如CodeSmith,Freemarker,Velocity等.

对于以上两种类型的代码生成工具,内置模板型由于将模板内置在程序中,用户不能定制模板和生成规则,其应用环境非常有限,通用性也比较差.对于CodeSmith,Freemarker,Velocity等[2]可定制模板型生成工具.尽管功能强大,能满足各种代码生成需要,具备较强的通用性,但这些生成工具所支持的代码生成控制语言要么基于一种实际的开发语言(如CodeSmith基于C#语言),要么基于一种通用解释型语言,掌握语言本身就需要花费大量的时间,同时这些语言同关系数据模型结合不紧密,往往编写的模板代码结构复杂,难于维护,也很难在软件开发团队中得到快速的应用.

2 基于关系数据模型的代码生成原理

2.1设计思路通过上述代码生成技术分析可知:如果能在保持可定制模板型代码生成工具框架结构基础上,对其代码生成控制语言进行改进,采用一种与关系数据模型紧密结合的代码生成控制语言,将可以保持生成工具通用性,并提高代码生成工具的可用性.据此,我们对代码生成工具的设计划分为两部分:(1)与关系数据模型紧密相关的代码生成控制语言(以下称RDM CodeMark语言)的设计;(2)基于RDM CodeMark语言的代码生成工具(以下简称RDM代码生成工具)的设计.

2.2 RDM代码生成工具工作原理

图1 RDM代码生成工具结构模型

2.2.1 RDM代码生成工具结构模型 RDM代码生成工具在原理上仍是一种基于模板的代码生成工具,具有该类型代码生成工具的通用结构,具体实现上有特殊之处,图1是RDM代码生成工具组成模型:(1) 关系模型建模:对关系模型进行的形式化描述,代表系统的关系模式信息,构成RDM代码生成器的输入.模型可以采用Word文档、运行的数据库以及UML文档等;(2) RDM CodeMark语言:同关系数据模型相关的代码生成控制语言,采用类XML语言的语法格式和迭代语义规则,用于编写代码模板文件中动态代码生成脚本;(3) 模板文件:采用RDM CodeMark语言编写的代码生成控制脚本文件(即RDM CodeMark语言程序),用于定义输出代码文件的创建信息和在生成文件中定制代码内容;(4) RDM代码生成器:代码生成工具核心程序,以关系模型建模作为输入,执行指定代码模板文件,输出生成后的代码文件.主要由关系数据模型管理部件和代码生成部件两部分组成,其中关系数据模型管理部件用于将不同的外部关系模型建模导入后转换到内部标准关系模型对象集进行维护和管理,为代码生成部件提供一致的关系模型访问接口.代码生成部件则通过调入指定模板文件按照RDM CodeMark语言迭代语义规则执行,在执行过程中嵌入对关系数据模型对象集标记的解析,最终生成实际程序代码文件;(5) 代码文件:实际生成代码的输出文件,是可以在项目系统中加入的可编译源程序文件.

2.2.2 代码生成工具工作过程 (1) 采用RDM CodeMark语言编写代码模板文件;(2) 采用word文档、数据库建库工具或UML对关系模型建模;(3) 在RDM代码生成器中导入关系模型建模,转换为内部统一关系数据模型对象集,并维护对象集信息的完整性;(4) 在RDM代码生成器中选择模板文件并执行,生成目标代码输出文件.

表1 表对象属性及其标记

3 基于关系数据模型的代码生成技术

3.1关系数据模型对象集设计

关系数据模型对象集是对具体项目所设计的数据字典的统一对象化表示,构成代码生成部件的实际输入支持对象.关系数据模型对象集由表集合、表、列集合、列对象组成,对应关系数据模型中的元模型数据.

表对象主要属性及其在脚本中的代码标记如表1,列对象主要属性及其在脚本中的代码标记如下表2.

表2 列对象属性及其标记

3.2 RDM CodeMark标记语言RDM CodeMark标记语言是结合关系数据模型设计的代码标记语言,在语法格式上接近XML语言,通过在代码模板中嵌入标记语言编写的脚本程序,为代码生成部件提供代码生成控制.RDM CodeMark语言的语法成分分为三种类型:迭代控制语句、输出控制语句和关系模型对象代码标记.

3.2.1 迭代控制语句

1) 表迭代语句TableLoop:执行对所有的表进行一次迭代展开.

语法格式:,其中:

(1) 对参加迭代的表进行过滤,其语法为:

.

(2) 为迭代的表模板展开项之间提供分割符,语法为:.

2) 表检查语句TableCheck:执行表属性检查,满足条件的,执行对应的模板.

语法格式为:,其中:

构成判断的条件部分,其语法为:

.

(3)列迭代语句ColumnLoop:对表中所有列进行一次迭代展开.

语法格式为:

(4)列检查语句ColumnCheck:执行列属性检查,满足条件的,执行对应的模板.

语法格式为:.

(5)调用脚本语句CallScript:将嵌入的模板脚本执行,并引用其输出.

语法格式为:.

(6) 脚本包含语句Using:将指定的模板文件嵌入到当前文本中.

语法格式为:.

3.2.2 输出控制语句 输出控制语句只有一个OutputToFile语句,用于将迭代生成的文本写入到指定文件中.在一个文本文件中多次使用则可控制生成多个文件.

语法格式为:

其中,用于提供程序文件的相对输出路径,语法为 .

3.2.3 关系模型对象代码标记 见表1和表2中各个对应属性的标记语法部分.

3.3 RDM代码生成脚本(模板)文件使用RDM CodeMark标记语言编写的脚本文件是一种特殊的解释型代码生成控制程序(简称RDM CodeMark脚本程序),能够在对应的翻译器中控制执行,以关系数据模型对象集作为输入,动态生成与关系数据模型相关的各种程序代码.

RDM CodeMark脚本程序中文本分为两类:RDM CodeMark标记语言语法成分和普通文本.RDM CodeMark脚本翻译器针对RDM CodeMark标记语言语法成分进行迭代解释输出,而对于普通文本则不做处理直接输出.RDM CodeMark脚本程序的编写规则取决于翻译器的代码生成规则,具体规则见4.2节代码生成的算法.

RDM CodeMark脚本程序示例如下:

(1)用于生成对表进行Insert操作的SQL语句,见图2:

图2 表的Insert操作模板脚本

(2).Net平台下数据操作模型对象的生成实例,见下图3:

图3 .Net数据操作对象模板及代码生成实例

4 RDM代码生成工具实现

4.1 RDM代码生成器的静态类结构RDM代码生成器的静态类设计可划分为数据模型管理、数据模型导入,词法解析,文件写入,脚本迭代解析,代码生成等不同职责的类集合.其对象关系见图4.

图4 RDM 代码生成工具类结构框架

数据模型管理类集合的作用是对关系数据模型的标准化表示和统一管理.由TableStandar-dModel、TableSet、Column-StandardModel、ColumnSet、DataModel-Catalog类构成,分别对应表标准模型类、表集合类、列标准模型类、列集合类、数据模型管理类.

数据模型导入类集合的作用是将外部各种形式的应用系统关系数据模型设计转换为内部标准数据模型,IDataModelImporter是导入类的抽象接口,主要方法为 DataModel-Catalog ImportDataModel(),为所有具体的导入类提供统一的功能规约.DataBase-Importer、XMLImporter、DocImporter、UmlImpo-rter类实现IDataModel-Importer接口,对应实现以数据库系统、XML数据模型设计文档、Word数据模型设计文档和UML数据模型设计文档作为源模型向标准数据模型的转换.ScriptBuilder、FileWriter、CodeParser-Util类属于工具类,分别实现脚本文件的构造、脚本文件的输出、脚本的语法成分解析,为模板文件的迭代生成提供底层支持.

脚本迭代解析类集合按照RDM CodeMark标记语言的各个语句的语义要求,实现各种语句的脚本迭代解析,解析的过程就是局部生成目标代码的过程.所有语句解析类实现一个统一的脚本解析接口IScriptParser,其主要方法为string ParseScript(),实现脚本的迭代生成的功能规约.图2中实现IScriptParser的各类分别对应实现各个语句的语义迭代翻译,限于篇幅此处不再详述.RDMCodeGenerator类是代码生成器的核心控制器类,以数据模型为输入,执行加载的模板文本,并生成最终的程序代码.

4.2 RDM代码生成的关键算法RDMCodeGenerator类的方法Generate()是生成目标程序代码的关键方法,该方法的执行算法见下图5的代码生成序列图.

图5 代码生成序列图

图6 采用Delphi实现的RDM代码生成工具的主界面

4.3 RDM代码生成器界面与功能按照RDM代码生成工具的设计,可以采用任意支持面向对象编程的开发工具进行实现,图6为采用Delphi实现的RDM代码生成工具的主界面,其主要功能包括:数据模型设计文件的导入和编辑管理,模板文件的编辑和管理,模板的选择与执行管理,脚本的生成与输出管理等.

5 RDM代码生成工具应用实例

RDM代码生成工具可按照应用系统数据模型设计快速生成应用系统开发的基础框架代码,以“武汉大学本科生课程标准化考试系统”为例说明生成工具搭建系统框架程序的过程,如下图7所示:

图7 RDM代码生成工具搭建系统框架程序实

图8 .Net中生成的项目解决方案图示

过程说明:(1)采用word文档将系统的数据模型设计进行文档化并导入工具中转换为标准数据模型对象;(2)生成数据库建库脚本SQL文件,在MS SQL Server2005中执行并创建数据库;(3)按照.Net多层程序框架,依次生成应用系统的Model层(模型层)、DAL层(数据存取层)、FacadeBLL层(基础数据逻辑层)、UI层(基础用户界面层)代码[3],见图8;(4)在.Net开发工具VS2005中完成系统业务逻辑编程以及界面和程序的优化.

在此项目的实践中,大约70%的程序代码编写工作转变为工具生成,大大提高了系统开发的效率,增强了代码的稳定性.

6 结束语

通过采用RDM代码生成工具,可以形成一套完整的程序开发模式.通过在WORD文档或直接在软件中建立系统数据模型,使用此生成工具可以生成从数据库创建SQL脚本文件,到.Net或J2EE开发平台上的各层直接可编译代码文件,从而大幅度简化项目的代码开发工作量.另通过在开发工具中增加对生成文档和程序文件的自动比对功能,则可识别出生成代码中被维护的部分,从而在数据模型改变时可很快的迁移这部分修改,进一步增强了代码的可维护性.

当然,本文所描述的关系数据模型只是一个简化模型方案,若在此基础上结合更多的数据模型特征或增加脚本语言的功能,则可进一步提高生成代码的质量和生成工具的可适用性.

参考文献:

[1] 肖寒.J2EE平台下代码自动生成技术研究[J].电脑知识与技术,2009,5(20):5421-5422,5434.

[2] 孙茂增,李凤华,都婧.基于Velocity的J2EE应用代码生成系统[J].仪器仪表用户,2008,15(1):105-106.

[3] 陆远,胡莹..NET平台下敏捷开发架构及代码生成技术[J].微计算机信息,2009(33):11-12,32.

[4] 杨美荣,史建锋,李明星.基于MDA 的代码生成器设计与实现[J].计算机工程,2009,35(12):47-49,53.

[5] 杨皓,杨忠,吴愚.基于XML脚本的代码生成技术及其应用[J].电脑知识与技术,2009(7):7.

猜你喜欢

代码生成数据模型脚本
酒驾
安奇奇与小cool 龙(第二回)
Lustre语言可信代码生成器研究进展
一种基于模型和模板融合的自动代码生成方法
面板数据模型截面相关检验方法综述
快乐假期
小编的新年愿望
代码生成技术在软件开发中的应用
基于XML的代码自动生成工具
基于分位数回归的电力负荷特性预测面板数据模型