APP下载

使用元数据和反射的Web服务系统重配置设计与实现

2017-03-31孙承爱杜巧林于璇璇

软件导刊 2016年8期
关键词:元数据

孙承爱+杜巧林+于璇璇

摘 要:软件系统需要不断演化以适应外界需求或环境的变化,如何实现软件演化是软件工程研究领域的一个热点问题。提出一种基于元数据和反射的软件动态重配置方法,利用存储在关系数据库中的元数据描述系统的结构特征,采用存储过程表示系统的行为,并建立存储过程和功能的对应关系。使用元对象操作类实现元层和基层对象的反射关系,当软件的功能或显示界面发生变化时,通过配置元数据和存储过程,在运行时动态改变基层程序结构或功能,实现了软件的演化,并通过实例证明了该方法的可行性。

关键词关键词:需求变化;元数据;反射;重配置

DOIDOI:10.11907/rjdk.161650

中图分类号:TP319

文献标识码:A 文章编号:1672-7800(2016)008-0049-04

0 引言

隨着用户需求的改变和软件运行环境的变化,软件系统需要不断演化以适应这种新的变化,如何实现软件演化是软件工程研究领域的一个热点问题[1,2]。软件工程从许多方面,例如OOP、OOA/OOD、各种软件过程(RUP、XP)和方法等对此进行了研究。这些技术运用得当可以构建出可用、可靠、稳定的系统。但是,当需求发生变化时,现代软件存在着如下不足:传统软件主要采取了“黑箱”的实现机制,即对外部应用屏蔽了内部具体实现细节,这种机制使得外部应用无法获取系统的内部结构和状态行为,从而无法根据相关需求来动态调整系统应用级的结构行为,这样使得相关应用缺乏对变化环境的适应性[3-5]。

要解决上述问题,软件系统应具有如下特点:系统应具有较为开放的结构,使得外界能获悉系统内部相关成分,从而能根据外部环境变化对系统相应部分的结构行为作一定调整与改变;系统应具有动态重配置的能力,即能在运行过程中进行动态调整、定制和改变自身相关的结构行为,且不影响系统整体的运行[4]。

本文将元数据和反射引入基于关系数据库的Web系统设计中,通过对系统业务信息的具体化(reification),使得外部能获取系统自身结构、行为的自描述(self-representation)元数据,从而实现系统内部的开放;系统的自描述与系统结构行为是因果相连(causally connected)的,通过对元数据的调整与改变,可实现对系统特定部分和功能的反射,使得系统具有动态重配置的能力[6]。

1 相关研究

20世纪80年代后期,随着对反射式程序设计语言、反射式操作系统研究的深入,对反射系统也形成了一个较为一致的认识:反射系统可被认为是一种可通过因果相连的方式来反演自身的计算系统,反射则是反射系统的行为表示[7,8]。反射系统可以形式化地表示成二元组S=〈PL,TL〉,其中S为计算系统,L为系统S用以表示问题域所用的语言,PL为语言L的处理器,TL为PL的状态,RS为S在TL中基于L语言的表示,S与RS的关系为:S包含RS,且S和RS之间是因果相连的[9]。

在反射系统实现中,一般采用“关注分离”的原则,即系统分为基层(Base Level)和元层(Meta Level)。基层用于对具体问题域的抽象,元层则是对基层及系统内部的表示。元对象封装基层对象的元数据,描述基层对象的结构和行为,并动态地管理基层对象。反射是指通过获取元数据来观察和调整系统内部及基层相关部分结构行为的过程。

在利用元数据和反射技术实现软件系统的研究中,文献[10]介绍了在面向对象编程语言中使用反射和元编程需要遵循的3个重要原则。给出了使用元数据和反射的基本原理和设计规则,文献[11]通过使用基于XML描述的元数据和某些语言的自省机制来连接构件和基本框架,目的是构建可扩展的系统,其元数据描述重点在系统功能,实现功能的灵活扩展。文献[12]提出了一种基于构件的系统运行时变化和恢复的软件架构。通过完整描述系统运行时的状态和行为,使用构件框架的反射能力实现系统的运行时恢复。本文使用元数据描述系统的结构信息,利用存储过程来表达系统行为。元数据存储在关系数据库中,存储过程作为一个命名的独立模块可以被动态配置和调用。元数据和存储过程可以通过一个单独的配置系统动态管理,通过运行时反射机制实现系统的动态重配置。与文献[10]相比,本文方法不仅能实现功能扩展,还能管理系统的结构;与文献[11]相比,本文侧重点在于系统的动态重配置。

2 基于元数据和反射的动态重配置

基于关系数据库的Web系统是本文动态重配置方法研究的对象。很多关系数据库中都提供命名的批处理代码段,例如SQL Server数据库中的存储过程(Stored Procedure)、Oracle中的过程(Procedure)。这种命名的批处理代码段编写完成以后注册到服务器,通过名字可以反复调用多次,而且每个代码段可以有上百条SQL代码,这上百条代码在调用时只需要一条执行语句即可,不需要向网络发送上百条代码,能有效降低系统网络开销。批处理代码段可以包含若干代码,因此可以把系统的业务逻辑封装其中,使用时按名称调用即可。本文设计方法基于SQL Server数据库,把系统的业务逻辑封装到存储过程中。

当需求变化时,用户可以通过配置元数据和存储过程,动态修改基层对象,实现软件运行时动态重配置。

本文方法使用关系数据库存放元数据,所以要考虑元数据的完整性约束处理。

2.1 元层设计

2.1.1 元对象

元对象主要包括:数据表对象、视图对象、数据集对象、字段对象。具体如下:

(1)数据表对象描述关系数据库表,其定义包含名称、类别(所属的业务领域)。

(2)字段对象描述字段的详细信息和该字段基层的结构信息,例如基层程序的显示名称、显示长度、使用控件类型等。其定义主要包括字段名称、所属表、字段中文名称、约束类型、字段长度、显示次序、显示控件、计算方式、最小值、最大值。字段属于基本表,所以在图1中,表与字段关系为组合关系,并且每个数据表至少有1个字段。

(3)视图对象描述关系数据库中的视图。在关系数据库中,视图的字段分成两类:一类是构成视图的基表字段,另一类是由基表字段推导出的附加字段。因此视图对象在图1的设计中涉及到3个类:视图类、视图父表字段类、视图附加字段类。每个视图至少包括1个父表字段,有0到多个附加字段,其关系如图1所示。视图对象定义主要包括视图名称、视图中文名称、视图所属业务领域;视图附加字段定义包括字段名称,显示顺序、中文标题、类型;父表视图字段定义包括父表名称、字段名称、显示顺序。

(4)数据集对象是一种特殊的元对象。它和数据库中的存储过程一一对应,系统通过存储过程封装业务逻辑。例如在界面中显示个人所得税页面时,个人所得税的计算方法就可以通过存储过程存放到数据库中,当计算方法改变时,只需要修改存储过程即可实现业务规则修改。每个返回结果集存储过程包含的字段分为两类:一类是来自于基本表的字段,另一类为由基本表推导得到的字段。这两类字段分别用数据集附加字段和父表数据集字段表示。其中父表数据集字段的字段定义来自于父表定义。数据集对象在图1中主要包括3个类:数据集、数据集附加字段、父表数据集字段。数据集定义包括:数据集名称、数据集中文名称、数据集分类(所属业务领域);数据集附加字段定义包括:字段名称、中文名称、显示顺序、类型;数据集父表字段定义包括:字段名称和显示顺序。

2.1.2 三种元对象操作类和数据获取方法

对基层对象和元对象的操纵控制,主要是由反射模式的内省和调节功能来保证[6]。本文对表和视图的管理通过类TableDescription完成;字段管理通过类FieldDescription和类FieldDescriptionList来处理;数据集的管理通过类DatasetDescription来处理。其主要属性和方法如图2~图5所示。

为了更简明清楚定义操作过程,作如下规定:①对象T属于TableDescription;②对象F属于FieldDescription;③对象V属于TableDescription;④对象D属于DatasetDescription;⑤对象FL属于FieldDescriptionList。

(1) 过程1:根据表名或视图名取得数据。

①将表名或视图名传递给T.TableName,取得表描述信息;

②使用FL.GetFieldList(表名称),取得字段列表;

③foreach(F in FL.GetFieldList(表名称))

组合F成物理字段列表;

转到字段处理子程序;

④检索出业务数据,并绑定到页面对象。

(2)过程2:字段处理子程序。

①if 字段为自增(F.IsIdentity) then

字段设置为只读;

②if 字段有外键引用(F.FkField != null)then

将本字段呈现为外键关联出的值(例如主表中性别编码,在基层将呈现为外键表中数据男或者女);

③if 字段允许为空(F.IsNull==true)then

對字段不作非空验证;

④if 字段有最大或最小值(F.Min != null or F.Max != null) then 对字段作范围验证;

⑤转数据完整性处理。

(3)过程3:根据存储过程名称和参数取得数据的过程。

①将存储过程名和存储过程参数传递给D.ProName和D.ProParams,取得数据集描述信息;

②使用FL.GetFieldList(存储过程名称),取得字段列表;

③foreach(F in FL.GetFieldList(存储过程名称))

组合F成物理字段列表;

转到字段处理子程序;

④检索出业务数据,并绑定到页面对象。

字段元数据存放在关系数据库当中,须考虑数据实体完整性和参照完整性。对于实体完整性,主要考虑主键约束;参照完整性在本文中分成3类:标识关系、非标识强制关系、非标识非强制关系。

(4) 过程4:完整性控制。

①if F.ConstraintsType ==主键 then

加入基层类主键列表 (加入主键列表后,基层类在数据更新、删除等操作的过程中,会按照主键列表构造where字句进行更新、删除操作) ;

② if F.ConstraintsType ==标识约束 then

Case 增加 then 基层对象检测字段非空和外键约束;

Case 修改 then 基层对象检测字段非空和外键约束;

Case 删除 then 基层对象直接删除记录。

③if F.ConstraintsType ==非标识强制约束 then

Case 增加 then 基层对象检测字段非空和外键约束;

Case 修改 then 基层对象检测字段非空和外键约束;

Case 删除 then 基层对象直接删除记录。

④if F.ConstraintsType ==非标识非强制约束 then

Case 增加 then 基层对象检测外键约束;

Case 修改 then 基层对象检测外键约束;

Case 删除 then 基层对象直接删除记录。

2.2 软件运行和重配置过程

软件运行和软件动态配置过程如图6所示。配置好元数据后,软件会按照用户需求显示和按业务规则运行(图中步骤1)。基层控件接受用户操作要求并把需求具体化为对应的元数据提交给元对象(图中步骤2、3),元对象操作元数据并接收操作返回的信息(图中步骤4、5)。元对象会将数据库中的数据按照规则组织业务数据反馈给基层对象(图中步骤6),基层对象把信息反馈给用户(图中步骤7、8),这是一次完整的交互。当需求发生变化时,如果用户期望软件适应新需求,则可以打开元数据配置页面(图中步骤9),执行元数据配置操作,通过该操作修改元数据信息(图中步骤10、11、12)。当用户修改元数据后,重新进入功能界面就可以使用演化后符合新需求的系统(图中步骤13)。

3 运行时反射过程与实例

图7为一个运行时反射实例,其开发环境为VS2005和Sqlserver2005。两条虚线之间为元数据操作,虚线之外为基层界面。

在软件的基层界面中第一列名称显示为“教师名称”,根据前文过程1,显示其过程为:

①将表名“ Teacher”传递给T.TableName,取得表描述信息;

②使用FL.GetFieldList(“ Teacher”),取得字段列表;

③foreach(F in FL.GetFieldList(“ Teacher”))

组合F成物理字段列表;此时F中教师名称的物理字段为“tchrName”,即F.FieldName=“tchrName”),F.FieldCTitle为“教师名称”。

转过程2:对于F.FieldName=“tchrName”,为普通字段,因此自增、外键、非空、范围、数据完整性约束等验证都为false。

④检索出业务数据,并绑定到页面对象。

在运行过程中用户可以在3.2节第2步的元数据配置页面修改该列的元数据,例如修改成图中的“教师姓名”,按照上文所述的反射流程,修改元数据后,对应的基层对象的软件界面也会随之变化,如图3中第3步所示结果。

4 结语

本文提出了基于元数据和反射的Web系统重配置设计方法,详细描述了元对象的结构和操作元对象的方法,介绍了应对需求变化的动态重配置过程,并给出了一个简单示例。本文使用的方法能够部分解决需求变化的问题,但是本方法只适用于基于关系数据库的Web程序,其适用范围的局限性限制了应用价值,下一步应将其扩展到互联网软件上。例如,当利用Web服务作为构成系统的功能单元时,如何描述系统的结构,采用什么方式描述系统行为,从而使系统具有动态演化的能力。

参考文献:

[1]TOM MENS,JEFF MAGEE,BERNHARD RUMPE.Evolving software architecture descriptions of critical systems[J]. IEEE Computer, 2010,43(5):42-48.

[2]WANG YING,WANG LIFU.Research about model and ripple effect analysis of software architecture evolution[J].Acta Electronica Sinica,2005,33(8):1381-1386.

[3]HU HAI-YANG,MA XIAO-XING,TAO XIAN-PING,et al.Research and advance of reflective middleware[J].Chinese Journal of Computers, 2005,28(9):91-96.

[4]COULSON G,BLAIR G S,CLARKE M,et al.The design of a highly configurable and reconfigurable middleware platform[J].Journal of ACM Distributed Computing, 2002, 1(2): 109-126.

[5]SCHMIDT DC,CLEELAND C.Applying a pattern language develop extensible ORB middleware[M]. New York: Cambridge University Press,2001:393-438.

[6]National Information Standards Organization.Understanding metadata[EB/OL]. http://www. niso. org/publications/press/ Underst -andingMetadata.pdf.

[7]YASUHIKO Y.The apertos reflective operating system:the concept and its implementation[C]. Proceedings of the ACMOOPSLA'92,1992:414-434.

[8]PATTIE M.Concepts and experiments in computational reflection[J].ACM SIGPLAN Notices, 1987, 22(12): 147-155.

[9]HIDEAKI O.A study on multi-model reflection framework in distributed environments[D]. Department of Computer Science, Keio University, 1995.

[10]GILAD BRACHA, DAVID UNGAR.Mirrors:design principles for meta-level facilities of object-oriented programming languages[C]. In: Proceedings of the OOPSLA'04, Vancouver, British Columbia, Canada, 2004,331-344.

[11]OU JIN-LIANG,JIN MAO-ZHONG.A method of metadata modeling to construct extensible and flexible system[J]. Journal of Computer Science,2005,32(7:)214-217.

[12]GANG HUANG,HONG MEI,FU-QINGYANG.Runtime recovery and manipulation of software architecture of component-based systems[J].Automatic Software Engineering,2006(13): 257-281.

(責任编辑:陈福时)

猜你喜欢

元数据
财会信息资源元数据标准的研究
基于角色控制的异构数据展示在企业门户中的应用