一种基于领域知识共享的迭代式代码生成方法

文档序号:6431855阅读:97来源:国知局
专利名称:一种基于领域知识共享的迭代式代码生成方法
技术领域
本发明涉及计算机系统应用技术领域。具体来讲涉及一种用于面向行业应用领域实现快速开发的迭代式代码生成系统。
背景技术
代码生成系统具有多年的发展历史,从早期的语法分析器自动生成系统到后来的各种MDA自动生成工具。随着企业/政府信息化技术的发展,针对不同行业的行业应用开发需求越来越强烈。于是涌现了大量针对行业应用的代码生成系统和快速开发平台。现有的针对行业应用的代码生成系统往往基于静态面向对象语言(如JaVa/C#/Delphi)和组件技术,提供给行业应用开发者各种GUI拖拉式控件,能够实现对表单数据自动生成增删改查代码并保存到支持的后端关系型数据库。现有的针对行业应用的代码生成系统在实际应用过程中所存在的不足有
1、代码生成系统功能单一。企业/政府信息化在初期主要是各种表格信息的电子化和网络化,实现这些表格信息的单机/联网录入和查询。现有的代码生成系统满足了这方面的需求。但是随着行业信息化的进一步发展,软件必须能够处理更复杂的行业业务系统,必须拥有领域相关知识。现有的代码生成系统不提供领域相关的代码生成功能。所以针对行业用户深层次的需求,代码生成系统往往力不从心。此外,也有开发商提供针对特定行业领域的代码生成系统,但是这些代码生成系统不能应用于其它行业领域,应用范围太窄。2、代码生成系统扩展困难。a) 现有的代码生成系统往往不提供代码生成系统自身的扩展开发接口,当代码生成系统不能满足开发需求时难以简单扩展。比如众多面向企业应用领域的代码生成系统,其实核心的功能都是针对数据自动生成增删改查的代码。当要对应用进行深度开发时, 代码生成系统往往无法满足要求。而由于没有开放代码生成系统自身的扩展接口,导致难以在代码生成系统生成的代码基础上进行深度扩展开发。b) 代码生成系统没有考虑自动生成的代码本身的可维护性。针对同样的逻辑, 代码生成系统生成同样的重复的代码,没有利用MVC模式分离关注面,没有用继承等特性减少重复代码。同时代码生成系统往往要求用户不能修改自动生成的代码。这样导致应用开发者要更改某项功能时,必须繁琐的一编一遍点鼠标进行更改。比如某个系统有100个表单全部要更改layout属性,就要针对这100个表单点击右键更改layout属性,大概要点击500次以上的鼠标。其实如果设计合理,开发者只需要在代码中改一个地方。这样的代码生成系统不仅没有减少开发者的工作量,反而增加了工作量。3、不支持自动化测试。传统的代码生成系统提供给开发者的是一个GUI界面的集成开发环境,没有提供易于测试的CLI与API接口,所以难以实现自动化测试与及时测试。 这会导致代码质量低下,甚至大量返工。4、不支持迭代式的代码生成系统。这些已有的代码生成系统是一次性的。由代码生成系统开发商开发出来,交给应用开发商使用。代码生成系统拥有的领域知识是由代码生成系统开发商内置的。比如语法分析器自动生成系统的领域知识是语法分析,针对企业应用的表单自动生成系统的领域知识是数据库sql相关知识。但是不同行业应用的软件开发需要不同行业的领域知识,且当行业划分越来越细时,需要的领域知识也越来越复杂。 针对固化的内置特定领域的代码生成系统将不能应对现在的软件发展的趋势。软件系统本身必须能随着领域的扩展和深入而扩展,因而要求支持多层的迭代式开发的代码生成系统。实用的迭代式代码生成系统应该支持下面的场景拥有数据库相关知识的开发商提供数据库持久化支持的代码生成系统;然后电子政务系统开发商开发通用政务自动代码生成系统,该电子政务系统的数据应该能利用下层的代码生成系统自动保存到数据库;在更细分的电子警务领域,熟悉该领域的开发商可以利用电子政务代码生成系统开发出电子警务代码生成系统。

发明内容
本发明针对上述技术的缺陷,提出一种基于领域知识共享的迭代式代码生成方法。为了解决上述技术问题,本发明的技术方案如下 一种基于领域知识共享的迭代式代码生成方法,包括如下步骤
1)基于动态语言开发核心代码生成系统;
2)利用所述核心代码生成系统生成常规行业应用系统;
3)提取所述常规行业应用系统中的共性领域相关知识代码;
4)在所述共性领域相关知识代码基础上再次开发生成特定领域应用系统;
所述核心代码生成系统包括使用接口、开发接口、依赖说明文件、自动化测试和部署套件;通过对所述特定领域应用系统再次提取共性领域相关知识代码可以实现迭代。作为可选方案,所述开发核心代码生成系统包括如下步骤
21)开发支持数据增删改查的数据持久化系统和消息处理引擎,所述消息处理引擎用于调用和实现所述数据持久化系统;
22)开发规则引擎、流程引擎和表单模板系统,所述规则引擎和流程引擎用于对业务规则和业务流程的建模,所述表单模板系统用于提供相关数据/规则与流程表单的输入输出界面;
23 )生成使用接口和开发接口,所述使用接口和开发接口包括API、CLI、⑶I接口; 24)生成依赖说明文件、自动化测试和部署套件;
所述API接口用于继承父对象的属性,所述CLI接口用于命令行调用方式,所述GUI接口用于提供对象属性的输入控件;所述依赖说明文件用于说明各个模块的依赖关系,所述自动化测试套件用于测试所述核心代码生成系统,所述部署套件用于部署系统运行环境。作为可选方案,所述利用所述核心代码生成系统生成常规行业应用系统包括如下步骤
31)选择数据库,并定义领域对象和对象属性;
32)定义规则数据和流程数据;
33)调用所述核心代码生成系统生成输入输出界面与控制代码;
34)按特定需要修改自动生成的代码。
作为可选方案,所述数据持久化系统通过OR-mapping库辅助实现,所述 OR-mapping库至少提供save, update, find, delete方法,保存新增加的对象时,调用所述 save方法;更新对象时,调用所述update方法;查询对象时,调用所述find方法;删除对象时,调用所述delete方法,所述OR-mapping库获取所述数据持久化的属性,并构造插入数据库的SQL语句,所述SQL语句的格式为“insert into表名(字段1,,字段2,···,字段 n) values (值1,值2,…,值η) ”,所述表名对应于对象类名,所述字段名对应于对象属性名,所述值对应于对象属性值。作为可选方案,所述规则引擎基于开源的drools实现,所述流程引擎包括业务流程建模定义工具模块、过程定义模块、工作流执行环境引擎模块、任务管理模块,所述流程引擎基于开源的osworkflow或jbpm实现。作为可选方案,所述表单模板系统生产的输出界面是基于HTML+JS+Css的标准 web界面;所述表单模板系统包括表单定义器、表单数据绑定模块、表单管理模块;所述表单模板系统基于quaderno或JTang Form辅助实现。作为可选方案,所述核心代码生成系统嵌入全文搜索功能、数据挖掘功能和知识发现功能的一种或几种。作为可选方案,所述依赖说明文件的格式为“模块A 模块B [,模块C] ”,所述模块可以指代码、领域知识数据包、第三方组件、操作系统版本;所述自动化测试套件至少提供根据配置文件模拟待测试环境、查找所有需要运行的测试用例、运行所有的测试用例、报告测试结果功能;所述部署套件至少提供定义待部署目标环境、检查目标环境并自动安装缺少的应用和升级过期的组件、准备需要部署的代码包和数据包和安装代码包和数据包功能。本发明的有益效果在于
1.本发明产生的迭代式代码生成系统可扩展性强,相比于传统的一次性代码生成系统,可以适应不同的应用领域。由于底层采用动态语言开发,迭代开发时不存在编译过程, 不存在强类型系统的限制,故而可以灵活适配不同的应用领域。此外,采用消息引擎作为不同模块之间的调用接口,在耦合度上小于基于组件的代码生成技术,更适合构建大型和分布式系统。2.支持领域支持的积累与细化,提高细分行业领域的开发效率。代码生成系统最主要的目的是提高开发者的开发效率,通过迭代式的知识积累,面向特定领域时就能更生成更符合该领域的代码,减少开发者后期修改生成后代码的工作量。3.可测试性好,有利于提高项目质量,减少项目开发过程中返工的次数。传统的 MDA方法不提供测试接口,因而代码生成的质量无法保证,本发明通过分层架构与MVC模式减少重复代码,提供可测试的编程接口,使得可测试性大幅度提高,完全支持自动化测试。4.海量数据支持。传统的Sql数据库在处理互联网的海量数据时往往力不从心, Nosql数据库通过schema-less方案来减少DML操作导致的锁表,避免复杂结构与多表连接查询,从而提高了数据层的可扩展性,本发明方法的数据层即支持Sql数据库,也支持 No-sql数据库,只需要提供据的CURD接口即可,从而可以应用于互联网类的涉及海量数据处理领域。5.方便的部署系统。首先通过动态语言免除了烦琐的编译过程,此外通过统一的依赖管理与测试接口,方便了系统的自动化部署。


图1为代码生成系统的总体架构; 图2迭代式开发与部署过程。
具体实施例方式下面将结合附图和具体实施例对本发明做进一步的说明。1、首先实现一个核心的代码生成系统
代码生成系统采用JVM作为目标机器平台,从而屏蔽了具体硬件的差异。采用基于 JVM的动态语言作为开发语言。典型的JVM动态语言包括Jruby、Jpython jcala、Groovy、 Clojuer等。这些语言都可以用来开发代码生成系统,且不同语言直接可以互相调用。动态语言代码在运行时被动态翻译为JVM上的字节码,然后JVM虚拟机解释执行这些字节码。a)先开发一个支持数据增删改查的数据持久化系统。该数据持久化系统可以基于第三方OR-mapping库辅助实现,比如ActiveRecord或者Hibernate。 对给定对象, OR-mapping库应该提供save,update, find, delete方法。当要保存新增加的对象时,调用 save方法;当要更新对象时,调用update方法;当要查询对象时,调用find方法;当要删除对象时,调用delete方法。以save方法为例,当要保存某对象时,数据持久化系统将save请求转发到 OR-mapping库。OR-mapping库动态通过反射技术获得对象所有需要持久化的属性,然后构造一个插于数据库的sql语句(对于能够用标准sql实现的语句,不使用特定厂商数据库特有sql语法)。该sql语句的格式为“insert into表名(字段1,,字段2,···,字段n) values (值1,值2,…,值η) ”。其中表名对应于对象类名,字段名对应于对象属性名,值对应于对象属性值。比如对象为Student, Student的属性有两个name和xuehao, 当要保存学生“张三,20111023”到数据库时,自动生成如下的sql语句“insert into Student (name, xuehao) values ( ‘张三,,,20111023,)”。这样只要底层的数据库支持 sql标准,不管是sql server还是oracle,我们都能将数据保存成功。对于没有标准sql 可以实现的功能,比如查询分页功能,则可以为所支持的数据库构造单独的sql输出模板, 当部署时选择不同的数据库时,根据选定的数据库选择sql输出模板。对于Nosql数据库,可以采用类似于Sql数据库的OR-Mapping库实现数据持久化,比如通过ruby-mogodb-driver可以实现用Jruby语言保存数据到Nosql数据库 MogoDB0b)然后实现一个消息处理引擎,相关消息数据可以通过数据持久化系统保存到数据库层;消息处理引擎实现数据持久化的调用方和数据持久化的实现方的解耦。这样可以实现中间件应用服务器和数据库服务器独立部署,独立升级。此外,应用服务器的各部件之间也通过消息引擎互通,比如流程引擎、规则引擎、表单引擎之间也通过消息引擎协作, 使得整个系统模块性更强,功能升级更方便。消息引擎要支持点对点模型和发布订阅模式两种消息传递机制,可以基于开源消息中间件如activeMQ或者openjms辅助实现。消息引擎的消息格式默认采用Json格式,同时也支持XML格式和ftOtoBuf等二进制格式。以上面提到的保存一条学生数据的消息为例,应用模块通过消息引擎发送给数据持久化模块的
消息为
{
// , . // // //
action save ,
"object" {
////// TJL/ ^- //
name 张二 , "xuehao" "20111023"
}
}
消息的编码统一采用UTF-8编码。c) 接着实现规则引擎和流程引擎,以提供对业务规则和业务流程的建模。规则和流程的变更通过消息处理引擎触发。规则引擎实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。接受数据输入,解释业务规则,并根据业务规则做出业务决策。规则引擎可以基于开源的drools实现。流程引擎由如下几个模块组成业务流程建模定义工具、过程定义、工作流执行环境(引擎)、任务管理模块等。流程引擎可以基于开源的osworkflow或jbpm等辅助实现。d) 进而实现一个表单模板系统,提供相关数据/规则与流程表单的输入输出界面;表单模板系统生产的输入界面是基于HTML+Js+Css的标准web界面。web界面中的输入框对应于应用层需要保持和运算的对象属性。表单模板系统至少包括表单定义器、表单数据绑定模块、表单管理模块等。表单模板系统可以基于quaderno或JTang 辅助实现。还是以保存学生信息为例,表单模板系统至少生成如下的Web界面代码
〈input type=〃text〃 name=〃name〃 value=〃 张三〃> 〈input type=〃text〃 name=〃xuehao〃 value=〃20111023〃> 〈input type=〃submit〃 value=〃 提交〃>
e) 其它计算机相关领域功能的实现,包括全文搜索/数据挖掘/知识发现等。这些功能是可选的,不一定要由核心代码生成系统提供,可以由上层应用实现。上述核心的代码生成系统可使用动态语言开发,方便后期应用到各种未知的领域而无需事先设计对象继承体系,更改代码无需重新编译一方便了后期的部署。2、然后提供该核心代码生成系统的使用接口和二次开发接口,相关接口包括三种API/CLI/GUI接口。以保持对象为例API接口规定所有需要持久化的对象必须继承自 PersistentObject对象,然后通过继承获得save, update, find, delete方法。这样保持对象时调用save方法即可实现;CLI接口规定了命令行调用方式,如“save对象名(属性1 值1 [,属性2,值2])”,其中方括号内是可选参数。GUI接口则提供对象属性的输入控件,并提供保存按钮。当按下保持按钮后,所有输入的对象属性保持到数据库。3、提供该基本的代码生成系统的依赖说明文件,提供一个自动化测试和部署的套件。a)依赖说明文件的基本格式为“模块A 模块B [,模块C] ”,表明模块A依赖于模块B和模块C。模块可以指代码、领域知识数据包、第三方组件、操作系统版本等。b)自动化测试套件至少提供四个功能1根据配置文件模拟待测试环境,2查找所有需要运行的测试用例,3运行所有的测试用例,4报告测试结果。c) 部署套件至少提供四个功能1、定义待部署目标环境,2、检查目标环境并自动安装缺少的应用和升级过期的组件。3、准备需要部署的代码包和数据包。4、安装代码包和数据包。4、行业应用开发商利用该代码生成系统既可以快速开发常规的行业应用系统。步骤如下
a) 选择数据库,并定义领域对象模型和对象属性。这里以一个大学学生信息管理系统为例。选择数据库为Oracle IOgo然后建立一个Mudent对象,该对象有两个属性name 和学号。根据该Student对象信息自动建立数据库表到oracle数据库中。b)输入规则数据与流程定义数据。规则数据如学号第一位代表本科、硕士还是博士,学号中间两位代表入学年份,学号后5位为顺序号。流程定义数据如学生信息变更时要先输入人员录入变更请求_>班主任审核_>系领导批准_>流程结束。c) 调用代码生成接口自动生成输入输出界面与控制代码。根据以上信息自动生成基于Web的输入接口,自动生成流程控制代码、自动处理规则约束、自动生成数据库持久化代码。d)修改自动生成的代码以适应特定应用需求。e) 打包分发
5、行业应用开发商可以成为代码生成系统提供商。方法是将共性领域相关知识及领域数据提取出来,实现针对该领域的快速开发功能,然后打包领域知识数据库和功能代码,提供开发接口说明、依赖说明文件。比如可以将大学学生信息管理系统的对象模型数据、规则数据、流程定义数据、自动生成的输入输出界面与控制代码全部打包,然后提供给细分领域的开发商使用。6、细分领域的行业应用开发商则可以直接在领域代码生成系统上进行开发,并可以根据该特定领域要求开发应用系统,方法同步骤4。应用领域越具体,领域知识越丰富和明确,开发效率就会更高。从步骤6可以跳转到步骤5,从而成为一个迭代式的代码生成系统。比如学生寝室管理系统开发商可以和学生信息管理系统开发商合作,在基础的学生信息管理系统基础之上开发。学生寝室管理系统开发商需要扩展学生对象模型,增加寝室相关信息。增加寝室分配的规则和审批流程,生成输入输出接口和控制代码等。7、细分领域的行业应用开发商的系统依赖于该领域代码生成系统和核心代码生成系统,而领域代码生成系统依赖于核心代码生成系统。它们构成树形依赖。依赖通过依赖说明文件管理。当被依赖的系统更新时,上层应用系统可以直接受益于这些更新。以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员,在不脱离本发明构思的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明保护范围内。
权利要求
1.一种基于领域知识共享的迭代式代码生成方法,其特征在于,包括如下步骤1)基于动态语言开发核心代码生成系统;2)利用所述核心代码生成系统生成常规行业应用系统;3)提取所述常规行业应用系统中的共性领域相关知识代码及领域数据;4)在所述共性领域相关知识代码和领域数据的基础上再次开发生成特定领域应用系统;所述核心代码生成系统包括使用接口、开发接口、依赖说明文件、自动化测试和部署套件;通过对所述特定领域应用系统再次提取共性领域相关知识代码及领域数据可以实现迭代。
2.根据权利要求1所述的一种基于领域知识共享的迭代式代码生成方法,其特征在于,所述开发核心代码生成系统包括如下步骤21)开发支持数据增删改查的数据持久化系统和消息处理引擎,所述消息处理引擎用于调用和实现所述数据持久化系统;22)开发规则引擎、流程引擎和表单模板系统,所述规则引擎和流程引擎用于对业务规则和业务流程的建模,所述表单模板系统用于提供相关数据/规则与流程表单的输入输出界面;23 )生成使用接口和开发接口,所述使用接口和开发接口包括API、CLI、⑶I接口;24)生成依赖说明文件、自动化测试和部署套件;所述API接口用于继承父对象的属性,所述CLI接口用于命令行调用方式,所述GUI接口用于提供对象属性的输入控件;所述依赖说明文件用于说明各个模块的依赖关系,所述自动化测试套件用于测试所述核心代码生成系统,所述部署套件用于部署系统运行环境。
3.根据权利要求1所述的一种基于领域知识共享的迭代式代码生成方法,其特征在于,所述利用所述核心代码生成系统生成常规行业应用系统包括如下步骤31)选择数据库,并定义领域对象和对象属性;32)定义规则数据和流程数据;33)调用所述核心代码生成系统生成输入输出界面与控制代码;34)按特定需要修改自动生成的代码。
4.根据权利要求2所述的一种基于领域知识共享的迭代式代码生成方法,其特征在于,所述数据持久化系统通过OR-mapping库辅助实现,所述OR-mapping库至少提供 save, update, find, delete方法,保存新增加的对象时,调用所述save方法;更新对象时, 调用所述update方法;查询对象时,调用所述find方法;删除对象时,调用所述delete方法,所述OR-mapping库获取所述数据持久化的属性,并构造插入数据库的SQL语句,所述 SQL语句的格式为“insert into表名(字段1,,字段2,…,字段n) values (值1,值 2,…,值η) ”,所述表名对应于对象类名,所述字段名对应于对象属性名,所述值对应于对象属性值。
5.根据权利要求2所述的一种基于领域知识共享的迭代式代码生成方法,其特征在于,所述规则引擎基于开源的drools实现,所述流程引擎包括业务流程建模定义工具模块、过程定义模块、工作流执行环境引擎模块、任务管理模块,所述流程引擎基于开源的 osworkf low 或 jbpm 实现。2
6.根据权利要求2所述的一种基于领域知识共享的迭代式代码生成方法,其特征在于,所述表单模板系统生产的输出界面是基于HTML+JS+Css的标准web界面;所述表单模板系统包括表单定义器、表单数据绑定模块、表单管理模块;所述表单模板系统基于 quaderno 或 JTang Form 辅助实现。
7.根据权利要求2所述的一种基于领域知识共享的迭代式代码生成方法,其特征在于,所述核心代码生成系统嵌入全文搜索功能、数据挖掘功能和知识发现功能的一种或几种。
8.根据权利要求2所述的一种基于领域知识共享的迭代式代码生成方法,其特征在于,所述依赖说明文件的格式为“模块A 模块B[,模块C]”,所述模块可以指代码、领域知识数据包、第三方组件、操作系统版本;所述自动化测试套件至少提供根据配置文件模拟待测试环境、查找所有需要运行的测试用例、运行所有的测试用例、报告测试结果功能;所述部署套件至少提供定义待部署目标环境、检查目标环境并自动安装缺少的应用和升级过期的组件、准备需要部署的代码包和数据包和安装代码包和数据包功能。
全文摘要
本发明公开了一种基于领域知识共享的迭代式代码生成方法,包括如下步骤1)基于动态语言开发核心代码生成系统;2)利用所述核心代码生成系统生成常规行业应用系统;3)提取所述常规行业应用系统中的共性领域相关知识代码;4)在所述共性领域相关知识代码基础上再次开发生成特定领域应用系统;所述核心代码生成系统包括使用接口、开发接口、依赖说明文件、自动化测试和部署套件;通过对所述特定领域应用系统再次提取共性领域相关知识代码可以实现迭代,具有产生的迭代式代码生成系统可扩展性强,支持领域支持的积累与细化,提高细分行业领域的开发效率,可测试性好,有利于提高项目质量,减少项目开发过程中返工的次数。
文档编号G06F9/44GK102279750SQ201110252089
公开日2011年12月14日 申请日期2011年8月30日 优先权日2011年8月30日
发明者李莹, 袁新宇 申请人:浙江大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1