一种基于模型和模板融合的自动代码生成方法
王博; 华庆一; 舒新峰
【期刊名称】《《现代电子技术》》
【年(卷),期】2019(042)022
【总页数】6页(P69-74)
【关键词】自动代码生成; 模板; 模型驱动; 模型转换; 混合自动代码; 生成设置
【作 者】王博; 华庆一; 舒新峰
【作者单位】西安邮电大学 计算机学院 陕西 西安 710121; 西安邮电大学 陕西省网络数据智能处理重点实验室 陕西 西安 710121; 西北大学 信息科学与技术学院 陕西 西安 710127
【正文语种】中 文
【中图分类】TN911-34; TP301.6
0 引 言
随着信息产业的不断深入发展,应用软件需求和开发环境变得越来越复杂。传统软件开发方法开发周期漫长且工作重复较大,为系统演进和维护造成较大困难[1]。与此同时,新软件开发方法和思想以及工具,导致软件工程方法论发生深刻变化,尤其是以对象管理组织(Object Management Group,OMG)提出的模型驱动构架(Model Driven Architecture,MDA)为代表的方法论。在David S.Frankel 的《应用MDA》一书中指出:“把宝贵的时间浪费在‘纸上谈兵’上是一种罪恶。”[2]如果能够把设计直接转换成代码,亦即把设计和实现对应起来,那么无论对于代码质量和效率都会有较高提升。
自动代码生成,即根据用户任务需求建模而自动生成源代码的程序或软件。本文所特指自动代码生成技术是在软件开发过程中由经验而形成的一种软件工程技术,通过自动生成工具或者程序半自动/全自动的生成应用系统所用到的原始框架和代码,一般生成文本形式的源代码[3]。自动代码生成主要的优点和意义在于:减少重复的编码工作,生成代码风格一致良好,系统设计成为开发的主导,易于修改和升级,设计和实现具有连贯性。
本文提出一种采用模型驱动构架的设计思想,灵活配置的、融合模板和模型驱动的自动代码
生成方案,称之为混合自动代码生成(Hybrid Automatic Code Generation,HACG)。HACG 自动代码生成方法的创新点如下:
1)HACG 融合基于模板和模型驱动的代码生成的优点,可以简单高效地构建自动代码生成引擎;
免费模板生成器
2)HACG 提出针对不同语言、不同框架的统一的自动代码生成解决方案;
3)HACG 针对元模型的不同实体关系模型的自动代码生成方案和策略;
4)HACG 具有较高的灵活性、通用性、完整性和可扩充的特点;
5)HACG 对自动代码生成提出一种新的划分,分为基础功能容器、全自动代码生成、代码框架生成和定制代码。
1 基于模板和模型的自动代码生成
当前主要的代码生成主要有基于模板、基于模型驱动、基于对象关系映射、基于文档注释和基于代理的自动代码生成[4]。与HACG 较为相关的是基于模板和基于模型驱动的自动代码生
成,下面主要从上述两种方法展开。
1.1 基于模板的自动代码生成技术
基于模板的代码生成(Template-Based Code Generation,TBCG)起源于 20世纪 90年代中期,模板的重用是基于“编写一次,生成多次(Write Once,Produce Many)”的理念[3]。基于模板的代码生成是利用系统共性的需求(模板)和个性的需求(特定的外部输入),通过代码生成引擎来生成系统源代码的方法。基于模板的代码生成较为困难的问题是明确区分输入和转化逻辑,亦即将元数据和具体业务规则进行分离,通过使用模板引擎技术,可将业务规则抽象到模板文件中,将元数据作为动态插入数据[5]。分层技术是基于模板的自动代码生成核心技术之一。
分层技术在当前的软件开发中被广泛的使用。在软件开发过程当中,把具有不同过程的解决方案放置到不同的概念层,随后整个层次形成不够封闭的系统,其中每个层次在级别上具有平等性[6]。 层与层之间通过层接口进行数据交互。分层的优点在于提高系统的灵活性和可复用性,能够提高软件开发的效率。
定义1(分层结构) 约定n 层构架的各层编号为1,2,…,n,其中,层的编号越大,则越处于系统的高层。那么分层构架应该满足如下规则:
1)第 k 层(1<k≤n)层智能依赖于 k-1 层,而不能依赖于其他低层;
2)如果 p 层依赖于 q 层,则 p 的编号大于 q。
该原则保证层依赖的单向性,减少和降低系统逻辑的复杂性,使得系统在提高功能和可复用性前提下易于控制。
定义2(分层对象模型) 将基于分层体系的对象模型分成数据实体对象、持久层对象和业务逻辑层对象,每层的对象可以表示为一个n 元组。
1)数据实体对象 MO=(mo_id,mo_name,attr_set,op_attr)。其中:mo_id,mo_name 分别对应模型实体对象MO 的唯一的标识和名称;attr_set 代表该实体的属性集;op_attr 代表对该属性的操作,一般对应该实体的可读和可写算子。
2)持久层对象 PO=(po_id,po_name,mo,dll_set)。其中:po_id,po_name 分别对
应持久层对象PO 的唯一的标识和名称;mo 为持久层关联的模型层实体对象和实体对象集合;dll_set 为持久层对应的操作集合,如添加、删除、修改、查询、分页和排序等操作。
3) 业 务 逻 辑 层 对 象 BO=(bo_id,bo_name,mo,bll_set)。其中:bo_id,bo_name 分别对应业务逻辑层 BO的唯一的标识和名称;mo 为持久层关联的模型层实体对象和实体对象集合;bll_set 为业务逻辑层对应的操作集合,如登录、注册、审核等业务逻辑层的功能。
由于模板文件基于文本易于定制和调整,结合成熟的模板语言可使代码生成过程更具灵活性,故其在中小企业中应用较为广泛[7]。在自动代码生成方案中,模板、元数据和业务规则三个元素是必要的[8]。基于模板的代码生成过程见图1,图1a)描述基于模板的自动代码生成过程,图1b)说明基于模板的自动代码生成的各个组成部分。
基于模板的自动代码生成的过程如下:首先对用户需求进行分析,进行初步的分析和设计,在实现阶段制定要采用的框架和何种分层结构,根据功能需求,设计相应的模板文件,并根据设计模型或元数据模型,使用代码生成引擎去生成程序的源代码。对生成的基础源代码进行代码调整和特定代码的添加,调试之后将代码部署到基础平台和框架中。
1.2 基于模型驱动的自动代码生成
模型驱动构架的出现使得解决传统软件的开发问题并且以工厂化开发软件成为可能。模型驱动构架支持基于可视化模型驱动的软件设计、内容存储与交换,是一种基于模型的软件开发构架[2]。其最终目标是把针对特定计算平台的编码工作交由机器完成,从此将业务逻辑与实现技术结合,很大程度地提升软件开发效率和质量,降低开发成本,延长软件寿命,并实现工厂化开发软件。
图1 基于模板的代码生成过程Fig.1 Process of code generation based on template
1.2.1 模型层次结构
模型驱动构架中的模型组织分成四层结构[2],依次为 M0,M1,M2,M3。M3 是元-元模型,元对象机制(Meta Object Facility,MOF)位于该层。MOF 提供定义 M2层元模型所需要的更抽象一级的建模支持。MOF 是M2层所有元模型的元模型,同时它也是自描述的,即MOF可以描述MOF 元模型本身。在MDA 框架中,M3 层只有MOF 这一个模型,它是MDA 中基础和核心的标准,为MDA 框架中的所有模型/元模型提供统一的语言基础,为模型语言(元模型)定义提供公共标准。M2 层为元模型,代表建议MOF 之上的各种模型语言,提供对应不同领域的领域建模语言,为M1 层的建模提供建模符号。M1 层为模型层,是建模人员
通常面对的模型,即采用模型语言为企业应用建立的模型描述。MDA 的CIM,PIM和PSM 模型都位于该层,M0 层为实例层,是M1 层模型的实例化,对应模型的具体应用程序,是模型描述的最终目标。MDA 四层元模型体系结构如图2所示。
1.2.2 MDA 应用模型
MDA 应用模型包括计算无关模型(Computation Independent Model,CIM),平台无关模型(Platform Independent Model,PIM)和平台特定模型(Platform Specific Model,PSM)。它们与实例模型中的实现特定模型(Implementation Specific Model,ISM)关系如图3所示。
图2 MDA 四层元模型体系Fig.2 Architecture of meta-model of MDA four tier
图3 应用模型之间的转换Fig.3 Transformation relation among applied models
CIM 计算无关模型用于描述系统需求、功能、行为和运行环境,也称为业务模型。PIM 平台无关模型是抽出的业务逻辑,不包括与实现平台的技术相关的特定信息。PSM 平台特定模型,从相应的PIM 转换而来。 ISM 实现特定模型是PSM 的实例化,包括PSM 用于构建一个
系统并使之运行的所有信息,如程序代码、装载规格、部署说明以及配置规范等,是一个可以实际运行的软件系统[2]。
1.2.3 基于模型驱动的自动代码生成过程
基于模型驱动的自动代码生成的过程如下:首先根据用户的需求编写PIM,再根据PIM 和目标平台编写转换规则,MDA 代码生成引擎根据转换规则自动将PIM转化成PSM,最后将PSM 转换成代码[9]。MDA 通过两次模型转换和代码生成技术提高软件开发的效率,并使得系统具有较好的可一致性和可复用性。基于模型驱动的代码生成过程见图4。图4a)是模型驱动工程(Model Driven Engineering,MDE)的总体说明,图4b)是源模型到目标模型的模型转换过程,图4c)描述基于模型驱动的自动代码生成过程。
2 混合自动代码生成HACG
2.1 混合自动代码生成的基本思想
基于模板的自动代码生成具有较高的灵活性,定制和开发较为容易,可提高软件开发的可复用度;但也有其缺点,模板化的程序可读性差,生成的代码依赖于某种语言和框架,移植性
差。在其他类似项目中使用,如果不同框架或语言,需要重新构建自动代码生成引擎。
图4 基于模型驱动的代码生成过程Fig.4 Process of code generation driven by model