基于Java Bean组件技术的模型表示研究
2010-06-05孙禄,卢潇,张强
孙 禄, 卢 潇, 张 强
(空军工程大学 电讯工程学院,陕西 西安 710077)
模型表示研究一直是解决模型管理中存在问题的主要方式[1]。目前模型表示比较流行的方法有框架表示、结构化表示、面型对象表示、抽象表示、建模语言表示等,这些表示方法在理论研究和设计中对实际问题的解决都有显著的成效,然而各自又或多或少存在着不足:
1)框架表示模型类的定义没有引入继承机制,以及不支持模型的层次构造,而且将模型结构的数据转换为方法所需要的数据形式也非常困难。
2)结构表示模型的元素是对于特定的模型实例定义的,如果模型中的元素增多,则必须修改。很多模型不能正确区分各种元素,因此也就无法使用结构化表示。
3)用建模语言描述的模型实质上就是一个实际问题的求解过程,由于它不能使模型与数据集相独立,所以不能做到模型的重用和共享。
4)模型抽象的缺点是没有将对象和过程封装成一个整体,这是它与面向对象方法的主要区别。面向对象方法正是在抽象数据型的基础上发展起来的。
面向对象[2]的表示方法是当前最为流行的研究方法。它将模型作为对象来处理,每个对象都拥有自己的属性和操作这些属性的方法,即“对象=属性+方法”。再把模型和对象对应,将模型看作“类”,模型的输入输出参数和对象的属性对应,模型的运算操作、数据的存取操作和对象的方法对应,最终构造了个适当的有关类和子类的结构。
伴随着计算机和网络技术飞速发展,虽然面向对象方法已深入人心,但随着软件科学的不断发展,使软件应用置身与更加广阔的环境中,从而对应用软件的跨语言、跨平台和互操作性提出了更要求[3]。在这种情况下,传统的面向对象方法已经难以适应现代的分布式软件应用,这时基于组件的软件开发技术便蓬勃发展起来。
1 组件技术
组件化软件开发技术不同于传统的结构化程序设计技术,也不同于面向对象程序设计技术。可以认为组件化程序设计位于这二者之上,它更注重于应用系统的全局,要求对应用系统进行全方位的考察。在具体到某个组件或模块的设计时,仍然是以结构化程序设计和面向对象程序设计技术作为基础。组件开发模型的特点:1)组件可以方便地集成于框架中,不用修改代码,不用重新编译;2)组件的接口和实现两者分离。组件的具体实现被封装在内部,用户只需关心接口,不必关心实现细节。组件通过接口实现与其他组件和框架进行交互;3)组件的接口具有统一的标准,组件的组合运用相对容易。
组件开发流程如图1所示。
图1 组件开发流程图Fig.1 Flow chart of component development
目前较成熟的组件技术有Microsoft公司的COM/COM+,OMG公司的CORBA,SUN公司的Java Bean。这3种组件规范都实现了组件对象逻辑层次和位置分布的透明性以及相关服务,为基于组件的软件开发提供对象管理的基础设施。
CORBA是一种标准的面向对象应用程序体系规范。主要优势在于它的语言独立性、位置透明性、跨平台和互操作性,而且具有很好的负载均衡能力和安全性,并有众多公司的支持。但由于OMG向各公司提供的是技术规范而非实现细节,因此各种CORBA版本不是完全相同的,在利用这些扩展性能的同时,开发者可能不得不损失掉CORBA的互操作性和移植性。
COM/COM+组件是Microsoft提出的组件标准,最初作为桌面操作系统平台上的组件技术。现已发展成为Microsoft软件世界的应用系统集成标准。缺点是只能在Windows家族平台上运行,跨平台性差,无法满足异构环境下企业应用要求。
Java Bean组件模型为系统开发者和用户都提供了很多的便利,如减少系统的市场化时间,很好的可扩展性和可移植性,减少对开发者技术包的依赖,提高开发效率,保护企业已有的投资,降低开发应用软件的成本等。在多层应用环境下,厂商所开发的应用服务器担任着企业信息系统中不可或缺的角色,而EJB标准受到全世界大多数厂家的支持,在系统的开发、升级过程中会有更大的选择空间。
Java Bean是一个纯粹的Java类。一个Java Bean由属性、方法和事件3部分组成。其中,属性描述了组件的静态特征。通常组件对象中的私有数据成员外界不能够直接访问,需要通过专门的访问(Accessor)方法才能访问。Accessor方法在Bean中一般以getXxx()和setXxx()的形式成对出现,分别用于读取和写入属性的值。属性是Bean的共有特性,分为简单(simple)、索引(index)、绑定(bound)和限制(constrained)4种。方法用来表述Java Bean组件动态行为。在这些方法中有用来实现获取属性值和设置属性值的,Bean的公有方法是Bean和外界接口的一部分。同普通类不同的是,一方面,调用Bean的实例方法不是主要途径;另一方面,属性和事件是和Bean交互的主要方式。事件用于组件之间的交互,一个Bean产生的事件可以被多个Bean接收。事件处理是Java Bean体系结构的核心之一,通过事件处理机制,可以让一些组件作为事件源,发出可被组件环境或者其他组件接收的事件。这样不通过的组件就可以在构造工具内组合在一起,组件之间通过事件的传递进行通信,构成一个应用。
2 Java Bean组件化设计方案
模型组件化建立在模型规范化的基础上,采用组件技术实现决策支持系统中模型操作和运行的方法,通过上面对模型表示的叙述以及目前流行的3种组件技术标准的比较,本文以Java Bean组件技术为基础,研究设计模型组件化表示方案,内容包括模型设计规范、模型接口描述、模型运行描述。
2.1 模型设计规范
模型的规范化就是提取各个模型的公共信息,对模型进行统一表达,以方便模型管理、运行、组合等,包括模型编码规范化、模型数据规范化、模型规范化封装等。编码规范化便于模型管理,模型数据规范化便于模型的统一调度、组合运行等。它不仅影响模型的存储方式、运行方式、模型的组合结构,而且也直接影响到模型管理系统和模型服务器的体系结构。
传统方法认为,模型分为原子模型和复合模型。原子模型是划分的最小单位,功能不可再分割;复合模型是由2个以上的原子模型复合而成,它们的概念描述[4]为:
原子模型类(AMC)={Input,Output,Manipulate,Knowledge}; 复合模型类 (CMC)={Input,Output,Manipulate,Knowledge,Fit-together}。
由于模型的表示基本上采用的是程序化设计,在程序表示中,将模型规定为相同的属性形式有利于模型组合和调用,减少区分的各种开销。
在规范模型标准情况下本文将原子模型和复合模型定义为具有相同的属性形式:Model={Sort,Function,Input/Output,Combination},即分类属性、功能属性、输入输出属性、组合属性。具体含义是:1)分类属性:确定模型的分类特征,以此对模型进行查找、调用;2)功能属性:描述模型的功能作用;3)输入输出属性:模型输入输出参数说明;4)组合属性:模型是否可以组合以及组合方式特点。
在研究模型的组合特性时,需要对模型之间的关系进行划分[5]。不是所有模型之间都存在组合的可能性,相同或相似的知识领域内的模型,在满足组合条件的情况下才有组合的可能。模型组合的方法主要是通过输入输出的控制实现,这是模型组合的接口。模型能够组合需要满足以下2个条件:
1)Sm1∩Sm2≠Ø; 2)m1(O)∩m2(I)≠Ø;
即模型m1和m2的分类属性不为空;模型m1和m2的输出输入之间存在联系。
对于模型分类可描述为[6]:M0={mi∈M}Si} i=1,2,…,n;
其中,M0为总模型体系,Si为分类体系,mi为第i类功能模型群。 Mi={mij∈mi}Sij} i=1,2,…,n j=1,2,…,n;其中,Sij为第i类个群的分类关系,mij为第i类模型群中第j个具体模型。
2.2 模型组件化设计
图2所示为模型属性形式。
图2 模型属性形式Fig.2 Model attribution form
在规范化设计的基础上,结合组件技术对模型的各个部分进行定义:
模型类型(modelSort)的参数包括 modelname, comment,fatherports, childports;重要函数是 showmdelinfo(),用以显示以上参数。
接口(modelports)共分为3类,输入接口、输出接口和内部接口,模型组件对外只呈现输入和输出接口,用于模型组合是传递参数。两类接口的函数分别为set/getIutputData();set/getOutputData();
组合关系 (modelcombrelation)用来描述模型的组合信息,这也是确定模型是否具有组合的可能。
模型的功能部分(modelfunction)是模型内部运行部分,对外只有描述信息。这部分是模型设计者主要设计的部分。主要函数是 showfunctioninfo(),calculate()。
3 模型管理系统框架设计
模型管理系统是实现模型管理的系统,它对模型的管理主要体现在模型的建立、模型的运行、模型的修改维护以及模型的组合、集成等方面。模型库是模型管理系统的主要组成部分,模型库中的每一个模型都有如下部分:1)描述部分包括描述、主题和关键字等;2)输入输出部分包括输入参数部分和运行结果部分;3)运行部分,模型运行方法,模型的主要方法,得到的就是运行结果。
所有模型都通过统一格式的接口来管理模型库下的所有模型,利用Java Bean规范来调用模型。在组件接口中可以定义主方法,而主方法需要在Bean的实现类中实现。在每个模型的实现类就是这里的Bean实现类,它必须有相应的方法:
public void ModelCreate();//建立模型;
public void ModelRemove();//模型消除;
public void ModelActivate();//激活模型;
public void setSessionContext();//它允许会话 Bean存储会话环境信息;
而在模型删除、修改、更新方面,则采用基于模型表的管理方式,模型表中存储的就是模型字典的信息,对于每个模型在模型表中都有相应的记录对应。
public void setPropertity(String prop1){};//设置属性,其中propertity表示表里一个字段;
public String getPropertity(){return prop};//取得属性值;
在框架化设计的基础上,下面对模型的创建流程给出描述,如图3所示。整个过程分为3个阶段,编码阶段,设计阶段和运行阶段。
图3 模型文件运行流程Fig.3 Running flow of model files
在编码阶段,模型设计人员按照模型需求编写Java Bean的软件组件,此时需要建立Bean的属性、方法及事件,允许对Bean进行配置并相互传递参数。编写Bean程序与编写其他任何的Java程序一样,但要求写出的行为更容易配置。在设计阶段,模型设计人员通过运行组件集成工具结合需求分析将需要的Bean组件“关联”到一起形成新的Bean。设计阶段包括程序设计与系统集成。设计阶段最终输出结果是以jar文件形式给出的软件组件的装配结果。运行阶段,用户只要运行包含了已经完成的定制的jar组件既可实现模型的调用。
4 结束语
组件技术在复杂软件系统的设计中应用广泛,同时,模型表示研究又是模型管理研究的热点问题。本文运用Java Bean组件技术的优点,设计了组件化模型表示方法和模型管理系统框架。具有以下特点:1)利用了面向对象的封装特性,将数据和模型的方法结合到一起,在模型的调用中避免数据和模型的分离带来的不便;2)规范化后的模型表示在组合中通过一致的接口进行参数的传递,提高了组合的效率;3)模型文件采用java语言编程描述,然后打包成jar文件,在跨平台调用上有突出的优点。
[1]陈文伟.决策支持系统及其开发[M].北京:清华大学出版社,2000.
[2]陈昊鹏,李伟华.面向对象的DSS模型库管理系统设计[J].西北大学学报:自然科学版,2002,32(1):48-50.CHEN Hao-peng, LIWei-hua.Design ofmodel-base managementsystem ofDSS based on object-oriented database[J].Journal of Northwest University:Nature Science Edition,2002,32(1):48-50.
[3]Goul M,Corral K.Enterprise model management and next generation decision support[J].Decision Support Systems,2007(43):915-932.
[4]申建刚,夏国平.采用扩展OWL-S的决策模型表示框架[J].计算机工程与应用,2009,45(23):1-5.SHEN Jian-gang,XIA Guo-ping.Representation framework for decision models using extended OWL-S[J].Computer Engineering and Applications,2009,45(23):1-5.
[5]高畅.模型管理操作研究[D].北京:燕山大学,2006.
[6]Jarzabek S.Domain model-driven software reengineering and maintenance[J].Journal of System and Software,1993,20(1):37-51.