基于Velocity的代码生成引擎的设计与实现*
2012-03-26薛召王晶李炜
薛召,王晶,李炜
(1 北京邮电大学网络与交换技术国家重点实验室,北京 100876;2 东信北邮信息技术有限公司,北京 100191)
一直以来,软件工程界在如何减少软件工程师的工作量和提高软件产品的质量上做着不懈的探讨和研究。近些年,一系列Web开发框架,如Struts、Hibernate和Spring等,都从软件复用的角度成功地实现了减轻软件设计和开发的负担。这些框架均完成了底层逻辑代码的复杂工作。然而,在实际的大型软件系统或平台的开发过程中,仍然有大量的上层业务逻辑是重复的,而且这部分的任务量也相当可观,所以如何减少这部分的工作量就成了现阶段软件工程师需要解决的问题了。由于这些重复性的代码在很大程度上是相似的,所以通过模板的方式来实现代码自动生成的技术便应运而生[1]。
代码生成技术是一个专注于解放代码生产力,用程序来编程的研究方向,是MDA(模型驱动架构)思想的一个重要的技术基础[2],同时,也是对软件开发自动化的探索[3]。代码生成技术可以帮助程序员完成枯燥且重复性的工作,提高软件系统的健壮性和可维护性[4]。此外,也很容易进行扩展。
1 技术简介
Velocity是一个基于Java的模板引擎,它可以独立产生源代码、HTML和报告,也可以和其它系统相结合提供模板服务[5]。它让Web页面设计者能使用简单而功能强大的模板语言来引用Java代码中定义的对象。作为Java代码和网页之间的分离层,其使得Web设计者和Java程序员可以根据MVC(Model View Controller)模块并行设计一个Web站点,从而使得整个站点更容易维护。
2 代码生成引擎的设计与实现
2.1 引擎结构
如图1所示,该代码生成引擎主要由3部分组成:注解解析模块、Generator Engine和文件输出系统。其输入为标记有Struts2注解的系统平台业务对象[6]的Java代码文件,输出为该对象对应的JSP页面文件、业务逻辑层[7]Java文件、数据持久层[7]Java文件以及相应的Spring配置文件。执行流程为首先对包含注解的Java文件进行注解解析处理,获得注解信息后,由GeneratorEngine根据注解信息从模板库加载模板文件,然后通过文件输出系统生成各种文件。
图1 代码生成引擎结构图
该代码生成引擎实现了模型驱动的开发模式,允许用户在编写完成多个业务对象之后,通过添加注解,统一生成页面文件、业务逻辑层和数据持久层CRUD(Create、Read、Update和Delete)Java代码和配置文件。
2.2 详细设计与实现
2.2.1 注解解析模块
图2 注解解析模块结构图与UML图
如图2所示,注解解析模块主要由注解扫描模块、注解提取模块和注解处理模块组成。其涉及到的各个类主要为依赖关系。
注解扫描模块会根据配置文件中的路径去扫描相应的业务对象所在的源码包,并扫描每一个业务对象类。若类中声明了注解,则调用注解提取模块提取业务对象上的注解。注解提取模块提取到注解信息后,会调用注解处理模块。然后,注解处理模块会传递参数给GeneratorEngine,并委派其生成模板。
2.2.2 GeneratorEngine
代码生成引擎的核心是GeneratorEngine,其对Velocity的常用接口进行了封装。
图3 GeneratorEngine执行流程
如图3所示,GeneratorEngine生成代码的主要执行流程为:
(1)创建一个VelocityEngine实例,设置其属性,并完成初始化;
(2)创建一个VelocityContext实例;
(3)根据GeneratorEngine的参数,添加必要的数据到VelocityContext实例中;
(4)创建一个IO流实例用来输出模板内容;
(5)获取VM模板,通过Template类,并使用Velocity的getTemplate方法加载模板;
(6)合并模板和数据;
(7)调用文件输出系统生成各种文件。
2.2.3 文件输出系统
文件输出系统首先检查配置文件中的输出文件路径是否存在,若不存在则创建相应路径;然后根据模板输出各种文件。
3 结束语
本文描述的代码生成引擎作为手动开发的一个补充,可以避免开发者在那些重复性的工作上浪费时间与精力,同时也可以消除由于失误而产生的错误[8],提高了代码质量。
目前,代码生成技术虽受到越来越多的开发者和学者的关注,但发展仍然很不足。一方面的原因是,目前的技术仅能做到自动生成部分代码,只是作为手动开发的一个补充。所以导致众多开发者的热情不是很高。但是随着代码生成技术的理论基础的不断发展,随着业界实践的不断推动,未来能够满足自动生成大部分代码乃至全部代码的生成引擎终将会实现。希望这一天能够早日到来。
[1]Toeppe,S.Automatic code generation requirements for production automotive powertrain applications[A].Proceedings of 1999 IEEE International Symposium on Computer Aided Control System Design[C].Kohala Coast,HI.Aug,1999: 200-206.
[2]盛刚,韩莉莉著.J2EE代码自动生成研究[J].计算机系统应用.2006,(8): 31-33.
[3]Fang M,Ying J,Wu MH.A Template Engineering Based Framework for Automated Software Development[A].Proceedings of 10th International Conference on Computer Supported Cooperative Work in Design[C].Nanjing.May,2006: 1-6.
[4]Yang M H,Liao J X,Chen X.Performance analysis of service platform with unstructed supplementary service data[J].Journal of Beijing University of Posts and Telecommunications.Vol29,No5,Oct,2006: 93-97.
[5]李晓黎,张晓辉.Velocity网页程序设计[M].北京:人民邮电出版社.2001,11.
[6]杨柳.应用服务器业务层框架的设计与实现[D].2012,03.北京邮电大学.
[7]Naji,H A H.Research and design of library information system based on three layers architecture[A].Information Engineering and Computer Science.2010 2nd International Conference[C].Wuhan.Dec,2010: 1-3.
[8]Whalen M W.On the requirements of high-integrity code generation[A].Proceedings of 4th IEEE International Symposium on High-Assurance Systems Engineering[C].Washington,DC.Nov,1999: 217-224.