软件工厂模式的软件产品快速构建技术
2021-09-18马晨溪李彦平
马晨溪 李彦平
摘要:在研究了现代信息系统软件架构模式的基础上,提出了软件工厂模式的项目软件快速开发和构建技术。设计了一个自动模型开发和代码自动生成方法,通过CodeSmith代码模板可以将数据模型转化成为平台无关的可执行程序,并在此基础上研究了基于逆向工程的项目文档自动生成技术。通过在实际项目中的验证,使软件产品的开发时间缩短到1/10,设计文档编写的时间缩短到1/17,并且代码质量极大提高,应用开发和维护成本大大降低。
关键词:MDA;模型驱动;软件架构;代码模板;逆向工程;软件产品线
中图分类号:TP311文献标志码:A文章编号:1008-1739(2021)15-61-5
0引言
如何提高软件项目开发效率、降低研发成本、交付高质量的、客户满意的软件系统一直是软件开发企业追求的终极目标。而实现这一切的根基是建立在组织的核心资产建设和一套先进的软件工程方法,其中核心资产包括稳定可靠的软件架构、正确的业务逻辑和注释清晰的软件构件集合,可以不依赖于组织人力资源的变化而持续演进和发展。而一套先进的软件工程方法和自动化开发平台是实现核心资产快速构建的前提和保证。
从架构、开发方法和工具3个方面阐述了大型项目的开发方法,结合工具的使用,提出了一套软件工厂模式的自动化开发平台和产品线开发方法[1],将模型驱动开发(MDD)自动化代码生成、软件架构、设计模式、平台+插件、基于模板的开发、基于逆向工程的文档自动生成等几个方面的技术相结合,解决大型软件系统开发中速度和质量二者不可兼得的问题。
1软件工厂模式软件产品开发
采用软件工厂模式的软件开发方法的核心关键是基于MDA的软件开发过程[2],采用模型驱动开发(MDD)快速构建系统[3],主要特点是在软件开发生命周期的需求阶段建立模型,并在模型的基础上快速导出目标系统。
软件工厂模式软件产品开发分为业务对象模型开发、自动化代码生成和自动化文档生成3个阶段,整个过程如图1所示。
第1步是业务对象模型开发(AMD)。该阶段,首先采用面向对象分析和设计方法,对用户需求进行建模,建立领域的概念模型[6]和业务对象模型[4],分析出系统的界面类、控制类和实体类,然后对实体类进行建模抽象出系统的实体对象模型,并进行数据建模,建立系统的数据库物理模型。
第2步是自动代码生成(ASCG)阶段。根据系统的架构约束要求选择合适的架构实现模板、目标系统的编程语言和数据库实体,采用CodeSmith工具编写架构各层(数据访问层、业务逻辑层和界面层)的代码模板文件以及代码引擎模板。然后运行代码引擎自动生成架构各层的软件代码和为便于集成开发环境(IDE)开发的解决方案文件(如sln等),对代码业务逻辑进行简单的定制和修改,通过IDE进行编译自动生成可执行软件。
第3步是用自动文档生成(ADG)阶段。生成符合组织文档规范要求的数据库设计、概要设计和详细设计文档。通过代码逆向分析工具抽取类的属性、方法以及类之间的关系自动生成符合组织文档规范要求的数据库设计、概要设计和详细设计说明等文档[5]。
2自动模型开发
AMD是一种自动化的实体对象生成方法,能够根据数据库模型自动生成代码,根据数据库表一对一、一对多、多对一关系生成实体类,支持多平台语言,方便上层应用使用[2]。
自动模型开发的原理是读取数据库元数据,按照指定的经过测试的成熟代码模板文件、领域规则和软件架构约束,混合产生源代码。典型的代码生成器模型如图2所示,为了能够自动生成程序代码,必需的4个关键要素是设计模式(所产生代码的模板文件)、领域元数据、领域规则和软件架构约束。
3自动代码生成
软件架构是软件系统的顶层设计[3],基于最常用的分层架构模式和软件系统的使用场景,采用CodeSmith工具設计编写了软件架构各层(界面层、业务处理层、数据访问层和领域模型层)模板及代码引擎模板,以支持代码的自动生成[6]。如表1所示。在领域模型层定义了主要包括业务对象和属性相应的getter和getter方法;在数据访问层模板中,通过接口定义了不同的接口方法,包括数据库CRUD操作;在业务逻辑层的模板中,定义了初始化、表单验证、CRUD常用业务逻辑;在界面层模板中,定义了面向最终用户的页面流逻辑;代码生成引擎,定义了集成多类模板和批量执行的功能,并能够根据项目需要生成目标平台的工程项目文件,便于使用IDE打开项目文件并进行编译和调试。
每个层次的模板都具有各自独立的功能,通过代码生成引擎串联起来形成完整的系统,如图3所示。
(1)数据访问层模板
数据访问层主要包括用于与数据库关联映射的实体对象以及数据访问层(Dao)接口层和接口实现(DaoImpl)3个模板文件。业务数据库中的每张数据表都会对应生成一个Model对象,每个Model对象定义了get/set方法,Dao定义操作数据库的基本功能(如增删改查),接口实现DaoImpl层实现Dao层定义接口的具体实现,为业务层提供调用接口,适应不同的数据库类型,如Oracle、sqlserver、国产数据库和Nosql数据库等。
(2)业务逻辑层模板:调用DaoImpl层接口,向界面层提供调用接口服务。
BLL.cst:生成业务逻辑层代码的模板文件主要的方法包括:
CheckValid:对界面输入进行数据有效性、合法性检查,包括非空、类型和长度等;
Delete:根据主键从数据库中删除相关记录,并返回受影响的行数;
GetAllList:从数据库中读取并返回所有数据对象列表;
GetDataById:根据数据对象的主键从数据库中获取数据对象的实例;
GetPageList:从数据库中分页读取数据仅用于在数据控件中显示;
Insert:将数据对象新增到数据库中,并返回受影响的行数;
IsExist:检测是否存在该主键的数据;
Update:根据主键将业务对象数据更新到数据库中。
(3)用户界面层生成模板
支持桌面应用和Web应用2类,以满足C/S和B/S两种不同的架构模式。根据数据库描述文件的备注文件生成界面标签(label)项,根据数据库字段的类型生成表单元素,包括文本框、组合框、按钮及图片等,生成表单的提交按钮、取消按钮以及响应事件,包括表单初始化、数据填充、表单验证及取消等。主要的模板文件示例如图4所示。
(4)配置文件生成模板
系统运行必须配置文件,如数据库连接等,也在代码引擎运行时根据生成配置自动修改,如数据库类型、数据库名称、链接用户名、密码等。
(5)解决方案生成模板
根据目标语言的类型和软件开发的IDE环境,生成项目解决方案。支持VisualStudio2010以上版本、Eclipse3.5以上版本,支持exe、dll、jar等类型的组件和运行程序,打开解决方案文件,相关生成的领域模型层、数据访问层、业务逻辑层和界面层类文件能够自动加载。编译执行就可以生成可执行软件。包括的模板文件有:
WebConfig.cst:生成WebConfig的模板文件;
csproj.cst:生成csproj.cs文件的模板文件;
Default.asp..cst:生成defalut.asp文件的模板文件;
sln.cst生成sln文件的模板文件;
vs2010.cst:生成2010工程解决方案的主文件,被BuildAll.cst调用。
(6)代码生成引擎
支持根据项目需求,批量选择多个数据库表,完成领域模型层、数据访问层、业务逻辑层和界面层代码的批量生成,生成工程文件的模板文件。启动界面如图5所示。
开发人员根据需要设置作者名称、组织名称、系统中英文名称、命名空间、代码输出路径以及软件架构数据访问层、业务逻辑层、客户端C/S软件或Web网站界面,选择待生成的多个数据库实体,点击“generate“,根据用户的选项将自动生成软件代码和项目解决方案文件。主界面如图6所示。
生成后的文档的代码结构如图7所示。
(7)与传统的人工代码编写方法的对比
通过对一个由4个软件组成的中等规模软件系统来测算,新开发代码行数95 387,按照平均每人每天开发代码行数100计算,需要953/22/8≈8个人5个月的工时,使用自动代码生成方法,软件代码在分钟级生成,60%以上的业务逻辑实现基本生成,只需要在需要定制的部分做出修改,加上调试和测试的时间,总的研制时间不会超过1个月。软件开发的时间降低到1/10。这样的结果是建立在有可靠稳定的代码模板和成熟的关键算法组件的基础之上。通过软件代码模板的编写达到“一次编写,永久使用”的目的,极大地降低了人力成本,提高了软件测试用例的通过率。
4自动文档生成
在软件项目研制中,除了软件代码之外,工作量最大、最耗时的是数据库设计说明文档和软件设计说明文档的编写工作,对于大型软件项目常常需要耗费1~2个月的编写时间。针对这2类文档,研制了DBDcoumentCreater数据库设计文档生成工具和DocBuilder两类工具。
(1)数据库设计说明文档自动生成
为了提高数据库设计文档的编写效率,研制了DBDcoumentCreater数据库设计文档生成工具,能够读取领域元数据,通过读取数据库表包含數据库字段名称、类型、长度、非空项说明和主键、外键等内容生成数据库描述文档。数据库说明文档自动生成过程如图8所示。
(2)软件设计说明文档自动生成
软件设计文档包括概要设计部分和详细设计两部分,主要使用了DocBuilder和Doxgen两个工具,通过逆向分析对软件代码的类和类间关系进行抽取,然后按照文档模板的特定格式要求,对章节内容进行填充。设计说明文档自动生成过程如图9所示。
①软件概要设计文档(软件架构设计):主要包括逻辑视图、部署视图、开发视图、进程视图和用例视图。在逻辑视图中类包的组成通常由表格组成,详细描述类及其说明文件。文档模板根据逆向生成的类及其注释自动生成表格及其说明文件。
②软件详细设计文档:主要是对类包内每个类的属性、操作、操作内部算法的描述以及类关系的描述,通过代码逆向工程方法获取上述内容,根据文档模板,按照模板格式依次批量生成类的详细设计内容,尤其对于大型项目来讲,将会带来效率的极大提升。
(3)与传统文档编写方法的对比
通过对一个由4个软件组成的中等规模软件系统来测算,数据库设计文档和软件设计文档的总页数在998页,大量时间耗费在类详细设计部分,按照一周可以编写160页文档计算,耗费的人时在170人时,在采用自动化文档生成方法之后,假设一篇设计文档需要2 h进行文档格式标准化,4个软件的总设计时长不超过10 h。将文档编写的时间降低到1/17,而且设计文档和软件代码高度一致,避免了人为编写造成的设计文档与代码不一致的情况。
5结束语
详细介绍了基于模板的MDD、ASDG、ADG软件产品开发的具体实现过程,通过本方法,可以实现模板一次编写,多样化产品生成的软件工厂软件产品开发模式,使软件系统的构建可以像工业系统生产流水线一样,通过用戶简单的定制,选择不同类型的模板、数据模型,平台就能够按照用户的需求自动化生产,批量生成所见及所得的软件产品。产生的代码非常健壮,是高品质、高一致性、高效率的统一体;产生的文档与设计一致,是风格一致、逻辑清晰、可读性强、整洁规范的统一体;产生的测试用例可重用、可复用、可执行,是一致性、覆盖率高、可执行性高、执行准确、持续更新、复用性高的统一体。
参考文献
[1]普尔.软件产品线工程[M].张佳骥,李彦平,译.北京:国防工业出版社,2010.
[2]袁晓桂,吴掬鸥.基于MDA的软件开发方法的研究.现代电子技术,2017,40(14):52-54.
[3]岳辉,王全宇.基于MDD的住宅报警系统开发模型分析[J].兰州交通大学学报,2013,32(4):31-34.
[4]埃文斯.领域驱动设计:软件核心复杂性应对之道[M].赵俐,盛海艳,刘霞,译.北京:人民邮电出版社.
[5]叶彭飞,彭鑫,赵文耘.通过静态分析逆向恢复面向对象程序中的用况[J].计算机研究与发展,2010,47(12):2192-2200.
[6]朱晓辉,王杰华,石振国,等. NET下基于PowerDesigner和CodeSmith的软件自动化开发技术[J].计算机科学,2010,37(7):156-159.