第三章 特定领域建模与代码生成
本章首先归纳总结了创建特定领域元模型及其实现的方法与原则,介绍了使用GMF通过特定领域元模型快速定制生成特定领域建模工具的过程,并提出基于SA与SF创建覆盖不同业务类型的样例代码的方法与原则,然后总结归纳了特定领域建模与代码生成的整体过程,最后提出根据特定领域元模型将样例代码制作成代码模板的方法与原则,并介绍了通用代码生成引擎的组成部分以及代码生成的过程。本章提出的特定领域建模与代码生成的方法,可生成100%的程序代码,是提高软件开发效率与产品质量的有效途径。
3.1创建特定领域元模型
元模型就是用来描述模型的模型,如使用UML类图描述系统的结果就是模型,对类图中各个元素(如类、接口、关联等)的定义就是元模型。通过创建特定领元模型就可以由GMF快速配置生成特定领域建模工具。
3.1.1创建特定领域元模型的原则
通常由领域专家提取特定领域关键概念,创建特定领域元模型。同时,由于特定领域建模的另一个目标是生成100%的代码,所以创建特定领域元模型也要考虑技术实现,即创建特定领域元模型的另一个来源是与技术实现的完整映射。
SA通常存在两个特殊层次,用户界面层(UI)与数据访问层,这两个层次是软件系统的特有概念。本文将用户界面层与数据访问层作为特定领域建模的共性层次,即为特定领域模型建立两个通用模型,用户界面模型与数据访问模型。
本文提出的创建特定领域元模型应遵循的原则,如下:
(1)通过特定领域分析提取特定领域关键概念建立特定领域核心元模型,并建立核心元模型之间的关联关系。
(2)建立特定领域核心元模型的多角度视图的元模型,如静态结构、动态行为、物理部署等视图的元模型。
(3)提取用户界面关键概念建立用户界面元模型,如样式、布局、界面构件、交互数据等。
(4)提取数据访问关键概念建立数据访问元模型,如对象关系映射、JDBC、数据库表结构、XML等。
(5)提取技术实现的关键概念建立辅助配置管理元模型,为代码生成提供配置管理辅助工具。
(6)对同一领域关键概念使用统一名称进行标识。
上述6条原则从特定领域与技术实现两个方面保证了所建立的特定领域元模型的完整性。
3.1.2使用XML模式描述特定领域元模型
DSM并没有提供具体的技术实现,本文使用EMF创建特定领域元模型。EMF支持3种类型输入,本文使用XML模式描述特定领域元模型,并作为EMF的输入,生成特定领域元模型Ecore。
使用XML模式描述特定领域元模型的方法,如下:
(1)将关键概念定义为XML模式的Element。
(2)将关键概念的性质或属性定义为Attribute。
(3)为Element或Attribute定义简单或复杂类型。
(4)将关键概念之间的关联关系定义为Element,并嵌套添加子Element,分别指向关联端的Element。
(5)将成对或成组出现关键概念定义为Group。
使用XML模式作为EMF输入的优势在于可通过XML模式对特定领域模型进行语法与一致性等模型验证工作。针对特定领域模型多角度视图,为防止不同视图存在相互冲突,必须进行一致性检查验证【18】。本文对系统功能、结构、行为等模型描述进行一致性检查,检查措施有XML模式约束、错误定位提示、自动检测修正等。一致性检查验证的基础是特定领域元模型创建原则的第6条。
3.2特定领域建模
DSM从大幅度提高软件生产力的角度提出特定领域建模,它提取特定领域关键概念建立特定领域建模工具,进行特定领域建模,结合特定领域代码生成器直接生成最终产品。它强调特定领域建模,模型可以只适用于本领域,甚至是本产品或项目。
3.2.1使用特定领域元模型配置生成特定领域建模工具
目前,通常使用GMF实现创建特定领域建模工具。GMF提供图形化定制环境,开发人员可在图形环境中快速轻松定制生成自己的特定领域建模工具。
图3-1 配置生成特定领域建模工具
如图所示,本文使用GMF创建特定领域建模工具的具体过程如下:
(1)输入XML模式,通过EMF生成元模型Ecore。
(2)建立图形定义模型,输入Ecore,定制图形定义内容,生成.gmfgraph文件。
(3)建立工具定义模型,输入图形定义模型,定制工具定义内容,生成.gmftools文件。
(4)建立映射定义模型,输入Ecore、图形定义模型、工具定义模型,定制Ecore与图形工具之间的映射,生成.gmfmap文件。
(5)通过映射定义模型,自动生成完整的特定领域建模工具。
由GMF建立的特定领域建模工具具有图形化可拖拽的操作界面,可以非常方便的进行特定领域建模。
3.2.2以SA与SF为基础建立样例代码
特定领域元模型的创建必须考虑技术实现,但技术实现并不单纯服务于特定领域元模型,它同时还提供代码模板制作的基础,样例代码。
SA是系统的高层规划,提供系统划分与设计的方法,定义系统静态结构与动态交互等关系,在高层为系统搭建提供理论指导。目前常用的有MVC(Model、View、Controller)三层架构。SF是系统架构指导下对系统的共性部分进行抽象提炼形成的实现基础,在此之上开发完整的业务系统。目前常用的有SSH(Struts,Spring,Hibernate)框架。SA与SF是软件发展成熟的表现,它以复用为目标,使软件开发不必从零开始。
样例代码是面向业务、以系统框架为基础建立的完整的、可运行的程序代码,它说明了以SF为基础如何开发业务系统的问题。要实现生成100%的程序代码必须参照完整的样例代码制作代码模板,即对样例代码整体模板化。以SSH框架为例,需要将包括Jsp、Js、Config、ApplicationContext、Hibernate hbm、Po、Vo、Do、Dao、Service、Action等在内的所有程序资源制作成代码模板。这就要求样例代码的完整性及对不同业务类型的覆盖度。
本文提出创建完整的样例代码应遵循的原则,如下:
(1)针对不同业务类型建立样例代码,如信息管理类、流程审批类、信息发布类、决策支持类、数据检索类等。
(2)以(1)为基础,建立不同业务实体关联关系的样例代码,如1对1关联、1对多关联、多对多关联等。
(3)以(2)为基础,建立不同界面表现的样例代码。
3.2.3特定领域建模与代码生成
特定领域建模是代码生成的基础,基于系统架构与框架建立完整的样例代码是制作代码模板的前提,特定领域建模与完整的代码模板是生成100%的程序代码的保证。
图3-2 特定领域建模与代码生成
如图所示,本文提出特定领域建模与代码生成的方法具体过程如下:
(1)领域专家进行特定领域分析,提取领域关键概念。
(2)领域建模专家使用XML模式描述领域元模型。
(3)建模工具专家输入XML模式通过EMF产生特定领域元模型Ecore,通过GMF定制生成特定领域建模工具。
(4)系统分析设计师分析设计实现系统架构与框架。
(5)高级程序员编写不同业务类型的完整样例代码。
(6)领域建模专家进行特定领域设计,通过特定领域建模工具进行特定领域建模,并对模型进行检查与验证。
(7)模板制作员将样例代码制作成完整的代码模板。
(8)开发人员结合特定领域模型与代码模板,使用通用代码生成引擎生成100%的程序代码。
与传统的建模与代码生成技术相比,本文提出的特定领域建模与代码生成的方法,从多个角度以多种手段保证了最终生成100%的程序代码。
3.3代码模板制作和代码生成
代码生成通常使用代码模板通过代码生成器生成代码。代码模板的好处在于代码模板的易维护性与代码生成器的通用性,针对不同领域模型与系统框架,可快速删减或修改代码模板以响应环境的变化,而不需要修改代码生成器。
3.3.1代码模板制作
代码模板是代码的雏形,是对代码的抽象表达,它固化代码的共性部分,标记特性部分,在代码生成时,通过替换将特性部分转化成实际需要的代码。代码模板的共性部分也称为静态内容,特性部分也称为动态内容。
代码模板的特性部分有两个来源:特定领域模型及系统架构与框架。如针对业务表的增删改查,共性部分是增删改查,特性部分是各个业务表。又如数据库连接,共性部分是连接数据库,特性部分是数据库的类型、名称、访问地址等。样例代码是系统架构与框架的具体体现。代码模板的特性部分需要由领域模型与样例代码共同保障。
本文提出代码模板制作的2点保障机制,如下:
(1)建立完整特定领域模型,涵盖代码模板体现的所有特定领域关键概念。
(2)建立完善的样例代码,涵盖代码模板体现的所有平台技术相关概念。
本文使用基于签替换原理的模板引擎Velocity的VTL(Velocity Template Language)制作代码模板。标签替换就是根据VTL标记的名称在特定领域模型中查找相应的值进行替换,形成具体代码。VTL通过${}与#指令标记代码模板的特性部分。${}引用动态数据,如变量、对象等,#指令建立模板语言的控制结构,如选择、循环、引入文档等。
3.3.2通用代码生成引擎与代码生成
通用代码生成引擎通常由读入器、验证器、生成器、编写器、配置工具5部分组成,共同完成代码生成。本文在模板引擎Velocity应用程序接口的基础上进行了功能扩展,建立起通用代码生成引擎的一个具体实现,如图3所示:
图3-3 通用代码生成引擎与代码生成过程
各部分功能如下:
读入器:读入模型与代码模板并放入环境上下文中。
验证器:根据特定领域元模型检查验证特定领域模型。
生成器:动态加载VTL标记的特性内容,形成代码。
编写器:将代码写入到目标代码文件中。
配置工具:配置生成环境,如资源位置、编码格式等。
本文基于通用代码生成引擎的代码生成过程如下:
(1) 通过配置工具配置代码生成环境,加载类库,指定资源存放位置,设置输入/输出编码格式、日志等信息。
(2) 读入器根据环境配置中资源存放位置,读入特定领域模型与代码模板,并放置入环境上下文。
(3) 验证器根据环境配置中资源存放位置,读入特定领域元模型,对特定领域模型进行检查验证工作。
(4) 生成器基于标签替换原理将VTL标记的特性内容替换为特定领域模型中的相应的值,并形成代码。
(5) 编写器将代码写入到代码文件中,完成代码生成。
3.4本章小结
本章提出一种DSM的实现方法。通过建立特定领域元模型、配置生成特定领域建模工具、分析设计实现系统架构与框架、建立样例代码、制作完整的代码模板、建立通用代码生成引擎,最终实现了特定领域建模与生成100%的程序代码。实践表明,特定领域建模与可生成100%的程序代码的代码生成方法是提高软件生产力的有效手段。
有效的领域分析与设计方法是提取特定领域关键概念与创建完整的特定领域元模型的基础;与传统建模技术相比,基于DSM的软件开发关键在于能否快速有效的建立特定领域建模工具。这将是以后研究的主要方向。