从UML类图到Java代码自动生成技术研究
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
从UML类图到Java代码自动生成技术研究
张中宝1,韩同欣2,刘西洋1
1西安电子科技大学软件工程研究所,陕西西安(710071)
2北京航天航空大学计算机学院, 北京(100083)
E-mail:zhongbaoz@
摘要:本文描述了基于UML CASE平台的代码生成器的设计与实现。从可执行UML到高级语言的代码生成技术已经在实践中得到实现,本文描述的代码生成器采用了一种全新的面向对象的脚本语言Ruby和基于Ruby的XML接口REXML,处理生成自UML类图的XMI 文档。通过从XMI DOM树中提取建模系统模型元素的相关信息,之后构造合适的容器类存储提取的数据,并访问这些数据进行ERb模板匹配,最后生成了可执行的Java代码框架。整个开发过程遵循模型驱动的软件开发方法,以更灵活的脚本语言和模板机制实现了模型驱动架构MDA从平台无关模型到平台相关模型的转化。
关键词:模型,代码生成,MDA(模型驱动架构)
中图分类号:TP312
1.引言
模型是应用程序或系统的某些部分的简单抽象表示。用户可以以任意的复杂程度构建模型:从在白板上手绘的方框图,到使用建模工具生成的复杂的UML图。然而,实际开发却经常脱离模型,模型只作为一个系统的蓝图,开发者仍然要手工编写所有的实现代码。随着应用程序的进展和规模的扩大,开发者经常发现坚持使用模型所带来的约束要远远大于其用途,维护模型变成繁琐的工作而不会产生帮助。设计阶段产生的UML模型和代码之间的同步变得越来越困难——代码为了应付新增加需求和新产生的想法而不断变化,模型却一直停留在原地不动,这使得模型在一段时间以后失去了它的价值。模型驱动开发是一种能够将模型与实现更紧密地联系在一起的开发方法。使用MDD,模型不仅能用来封装应用程序的设计,还可以用来生成实现代码。它是模型驱动架构[1](Model Driven Architecture, MDA)的一部分,MDA 表示了一种模型驱动开发方法的概念框架。
代码生成是一个专注于解放编码生产力,用程序来编程的研究方向。它是MDA思想的一个重要的技术基础。MDA的基本思想是在软件开发中以模型为驱动,由模型来生成或编译成程序代码,实现软件需求。只有在代码生成技术获得充分发展的基础上,模型驱动架构的思想才能得以实现。
在软件项目中运用代码生成技术可带来以下几大好处:
1)高效率。代码生成的工作主要是建立和维护输入模型,而这些输入模型基本上或全部都能从设计模型转化过来,工作量很少,因而软件生成率得到成倍提高。
2)高质量。代码生成技术使用代码模板来生成代码,模板越完善,生成的代码就越好。模板改善后,所有生成的代码质量都能提高,并且代码的命名和风格都能保持一致。因而采用代码生成技术能获得更高质量的代码。
3)更易维护。当需求改变时,大多数的代码生成器都能在输入模型的基础上,重新生成满足新需求的代码,这能有效地降低软件需求变更带来的风险。
4)促进团队的分工和发展。由于编码工作量少,程序员的工作得到解放,项目团队有更多时间来进行设计和架构优化,以及设计更好的代码生成工具。
目前,代码生成技术的发展还处于初期阶段,代码生成工具主要是用数据库模型来生成基于数据库的程序代码。代码生成技术较多的应用在集成开发环境和专业的代码生成工具
中。已公开的相关的研究成果比较少[2][3],商用工具有Rhapsody、Rose RT等等,它们实现了简单类图和状态图的代码生成。
本项目的研究涉及到模型驱动的构架思想,模型驱动的开发方法以及代码生成技术。项目将要完成的任务是在模型驱动构架的思想下,采用模型驱动的开发方法,设计一个代码生成器,实现从UML[4]类图到Java语言的代码生成。项目的实现为模型驱动架构思想的实现提供了技术支持。
2.代码自动生成器的设计
可执行UML中以类图来建模系统的结构,描述了对象的类型和对象间的各种静态关系。在模型-代码的映射关系中,结构对应代码的框架部分。这里给出结构实现的总体方案,其中的策略和技术同样适用于约束和行为。
2.1功能需求描述
为了实现从平台无关的UML类图模型到平台相关的代码框架,项目开发的生成器必需实现以下的功能:
1)读取由UML模型转化来的XMI[5]文件;
2)准确地将类图模型描述的现实系统生成Java语言框架。代码生成器的主要功能需求用例图如图1所示。
Java语言模板
图1 代码生成器主要功能需求用例图
2.2代码生成器系统框架
基于MDA思想的软件开发过程应实现平台无关模型到平台相关模型的转换,最终生成可执行的代码。以代码生成器开发为例,完全符合MDA思想的代码生成器必需包括模型检查子系统、代码生成属性设置子系统和代码生成子系统等三部分。模型检查子系统主要在生成可执行代码前进行相应的模型一致性检查, 将有助于发现模型中的问题和不一致性, 避免生成错误代码或无效代码,确保平台无关的模型的一致性和准确性。代码生成属性设置子系统主要完成代码模板的语言属性检查。代码生成子系统是最核心的部分,实现代码生成,将平台无关的模型映射为具体的Java代码框架,做到模型的平台相关(一段源代码框架也是模型)。
本项目只开发代码生成子系统。因为实现的是从类图到代码的生成,所以可以不考虑不同模型的一致性问题。代码生成属性设置体现在模型到代码的映射规则和Java模板中。生成器的前端输入是由UML类图模型转换而来的XMI文件,由Rational Rose2003的XMI导出工具导出生成。
2.3 代码生成建模
2.3.1 模型驱动开发过程
本项目采用的是一种模型驱动的开发方法。模型驱动开发的主要过程是:
分析与设计:基于开发系统的需求分析,系统设计人员进行分析和设计。这一步的工件是与具体平台无关的模型。
设计确认:由于在第一步构建的设计模型是可执行的,因此模型可以被确认其正确性。传统的确认方法,比如模仿执行的testing方法,对于可执行的PIM语言的集成开发环境都给予了支持。然而这些确认方法都是低效的,主要是因为测试案例覆盖的范围限制。在一个复杂的设计模型中,一般很难覆盖所有的测试案例。
代码生成:一旦设计模型被完全确认,那么传统的编程语言,例如C/C++和Java就能够从确认的模型中产生出来。代码产生主要基于一组预定义的模板,该模板详细说明设计模型中的语义实体怎样被编译成代码。
下图给出了模型驱动的主要开发流程。
图2 模型驱动开发流程图
2.3.2 代码自动生成机制
模型驱动软件开发的最终目标是产生可执行代码,即把为系统建立的各级分析、设计模型转换成特定语言的代码。代码自动生成的原理是根据建模平台的目标系统模型,以及对类和对象的详细设计中的规范说明信息,由代码生成器自动生成可执行的代码。具体地说,生成代码的信息来源有两个:代码生成属性(控制代码生成方式) 和模型元素规范(控制代码生成内容) 。代码自动生成过程是以数据容器为基础,将系统详细设计阶段得到的模型信息保存在数据容器中,在代码生成前,针对特定语言设定的代码生成属性也保存在数据容器中。在生成代码时,从基本数据容器中提取描述系统的信息,从数据容器中提取特定语言的代码生成属性值,依据系统对映射关系的描述,通过代码模板实现从目标模型到特定语言的可执行代码的转换。代码模板是代码生成器的关键,模板是在对特定语言(如C+ + ,JA V A ,