论文部分内容阅读
[摘要]基于组件的软件开发是面向对象软件发展过程的延伸,它实现了分析、设计、类等多层次上的重新使用。基于组件开发是当前软件开发技术的趋势,但目前还缺乏合适的过程模型,从而制约了其优点的发挥。从组件技术和基于组件的软件工程基本概念和发展现状出发,分析基于组件的软件开发模型和方法。
[关键词]组件 软件工程 软件开发模型
中图分类号:TP311 文献标识码:A 文章编号:1671-7597(2008)1110047-02
一、引言
随着软件复用技术的日臻成熟,利用可复用组件构造软件系统已成为软件开发的主要手段,基于组件的开发(Component-Based Development,简称CBD)和基于组件的软件工程(Component-Base Software Engineering,
简称CBSE)已经成为现今软件重用实践的研究热点。
二、软件组件和基于组件的软件工程
(一)基本概念
组件技术是90年代初出现的一种新技术,它是在结构化设计和面向对象技术的基础上发展起的,是面向对象技术之后的软件开发的标准方法系,是面向对象的开发技术的延伸。因此,组件具有面向对象的特征。一个软件组件是由契约性说明接口和明确的上下文相关性组合的单元。可以被独立地调度,而且常常由第三方开发。组件具有功能独立性、高度的可重用性、与语言和平台无关性等特点。基于组件的软件工程是软件工程进化和发展的产物,因此,它将会使软件开发过程中设计者的主要任务和所需技巧发生很大的改变。
(二)基于组件的软件开发的遵循原则
从基于组件的软件构建方式可以看出,基于组件的软件开发关键在于组件本身的开发,那么组件主要由那几部分构成,开发时又要遵循那些规则。下面给以详细说明:每个组件都是一个独立运行的操作系统任务或进程,它与一般的操作系统应用具有类似的调度和运行环境,组件的功能是由相关的函数实现的,组件的操作方法调用是通过接口实现的。由于每个组件可以承担多个角色,完成多个任务,因此可以为一个组件定义多个接口,每个接口对应不同的接口函数集合。刻画组件需要以下几个基本属性:封装、接口与实现、接口查询。
三、基于组件的软件开发方法
(一)体系结构
软件的体系结构代表了系统公共的高层次的抽象,它是系统设计成败的关键。其设计的核心是能否使用重复的体系模式。传统的应用系统体系结构从基于主机的集中式框架,到在网络上的客户端通过网络访问服务器的框架,都不能适应目前企业所处的商业环境,原因是:
1.企业过分地依赖于某个供应商的软硬件产品,不利于信息共享。
2.不能适应远程访问的分布式、多层次异构系统。
3.封装的应用系统难以维护,也难以满足复杂多变的用户需求。
4.不能实现分析、设计核心功能重用,最多只能实现代码重用。
目前,应用系统已经发展成为在Intranet和Internet上的各种客户端可远程访问的分布式、多层次异构系统。基于组件的软件开发为开发这样的应用系统提供了新的系统体系结构。它是定义标准的、分布式、模块化结构,使应用系统可分成几个独立部分分别开发,亦可采用增量方式开发。
(二)开发过程
归纳起来,组件式的软件开发方法应包括四个方面:首先应对组件有明确的定义;其次要有组件的描述技术和规范,如UML、JavaBean、EJB、Servlet规范等;第三开发应用系统必须按组件裁剪划分组织,包括分配不同的角色;最后要有支持检验组件特性和生成文档的工具,确保组件规范的实现和质量测试。总之,传统的软件方法学是从面向机器、数据、过程、功能、数据流、对象等观点反映问题的本质,是自顶向下进行,对重用没有提供更多的帮助。组件式软件开发是即插即用,它基于体系结构,以接口为中心,将组件有机组合,它把自顶向下和自底向上方法结合起来进行开发。组件技术的三个主要派别:Sun的J2EE平台、Microsoft的COM+、IBM的CORBA,其开发过程皆是如此。
(三)开发组织架构
传统软件的开发组织一般由分析员、设计员、程序员和测试员组成。对一个小的应用系统来说,一个熟练的开发人员,可能兼顾多个角色。但对基于组件的软件开发来说,组件开发与应用系统集成往往是分开进行的,因此整个开发过程由六个角色来完成:
1.组件开发者,也就是组件供应商,组件的提供者。
2.应用组件集成者,针对某个应用领域将已有组件组合成更大的组件模块或容器,作为系统部署的基本单元。
3.应用系统部署者,将系统部署基本单元放入选定的平台环境或基本框架中,完成软件定制的要求。
4.开发平台服务器供应商,提供服务器、操作系统和数据库等基本软件。
5.应用系统开发工具供应商,提供组件公共设施服务。
6.系统管理员,配置硬件、网络和操作系统,监督和维护应用系统者。
每个角色的工作专业性都很强,要兼顾成为多面手很不容易,目前已形成开放的组件市场。在开发过程中,重要的是组织好开发队伍,必须按本企业所具备的人才来组织,尤其是必须在开发初期选好标准框架,以及统一的开发指导方针,保证在整个开发过程中,各角色能随时互相沟通,人员素质决定了组件的重用率。
(四)组件技术实现条件
组件技术的实现必须具备四个条件:
1.要有标准软件体系结构,保证组件间通信协议统一,实现同步和异步操作控制突破本地空间限制,充分利用网络环境。
2.组件有标准接口保证系统可分解成多个功能独立的单元,用组件组装而成。
3.组件独立于编程语言。
4.组件提供版本兼容,以此来实现应用系统的扩展和更新。
四、基于组件的软件开发模型
(一)标识组件
这个阶段的主要工作是将应用程序分解为组件。分解时应特别注意分解后的组件粒度。粒度大的组件更节省工作量,但灵活性较差,改变难度大,丧失了CBSD所带来的好处。粒度小的组件灵活性好,但节省的工作量较小。因此必须在组件大小和灵活性之间做一个折衷。
(二)获取组件
这个阶段的主要工作是根据上一阶段分解后的组件功能从市场购买或从组织内部获得相应的组件。使用现有的组件而不是开发一个新组件,通常是满足一个给定需求最快最便宜的方案。
(三)设计组件
新的组件可以通过多种方式来产生。例如,它们可以从头开发,也可以从现有的应用中抽取,或者对已有的组件进行修改。在这个阶段必须生成一个对接口详细描述的文档。在这一阶段应重点考虑为复用而设计,因为让组件在不同上下文背景中实现复用是我们的一个目标。下面是几个影响复用的设计原则:
1.组件应该包括那些不可分离的部分。如果有两个相互依赖的组件,那么就应该考虑能否合二为一。组件应该有一个一致的目标(它包括体现传统的品质,即高内聚、低耦合)。
2.组件提供的服务应该是上下文无关的。即组件不受调用它们的上下文背景的影响。
3.在定义每个服务时,尽量保持它的目标单一。多重目的的服务将增加维护开销,因为任何的改动不仅影响到要改变的功能,也将影响到其他被捆绑在一起的功能,这增加了出错的可能性和测试的费用。
4.服务的接口应尽可能的小。不要为了将来的需求而加上目前并不需要的参数。未来总是善变的。
5.对服务的命名应该尽量用英文表达出其所完成的功能。
(四)测试组件
对获取、更改和设计的组件进行功能测试。组件的目标是可以用在多种上下文环境中。在它被一个新的环境接受之前,必须确定它是否能正确地按规范说明实现功能。
五、应用示例
下面以某单位人事系统为例,说明组件开始的实际步骤与方法。
(一)组件的规格说明
软件的抽象规格说明用抽象机(AMN)来描述。一个抽象机的形式化描述包含了若干个子句,MACHINE、SETS、VARIABLES、INVARIANT、CONSTANT
-S、PROPERTIES、DEFINITIONS子句构成了系统变量的状态和属性等静态行为的描述。
员工组件的属性规格说明如下(其中封装了员工个人信息全部属性:姓名、工号、性别、年龄等):
MACHINE
Staff
SETS
STAFF;
SEX={male,female}
VARIABLES
Staff,number,age,sex
INVARIANT
staffSTAFF∧
number∈staff→NAT∧
age∈staff→NAT1∧
sex∈staff→SEX
INITALIZATION
staff:=φ||
sex:=φ||
age:=φ||
number:=φ||
MACHINE表示组件名。SETS子句定义两个集合:第一个延期集合STAFF,表示所有可能的(现在和未来的)员工;第二个枚举集合SEX,表示员工的性别(male或者female)。VARIABLES子句引进该机器的状态变量名,变量staff是集合STAFF的子集,它包含了那些已经将有关信息有效地存入数据库中的员工,number表示员工的工号,age对应员工的年龄,sex代表员工的性别。
员工组件提供三个操作:添加记录操作add(num,sx,ag),删除记录操作delete(sta),修改记录modify(sta)。下面给出了add(num,sta)操作的完整规格说明,其他操作省略:
OPERATIONS
add(num,sx,ag)=PRE
STAFF-staff≠φ∧
num∈NAT∧
sx∈SEX∧
ag∈NAT1
THEN
ANY newsta WHERE
Newsta∈STAFF_staff
THEN
staff:=staff∪{ newsta }||
number(newsta):=num ||
age(newsta):=ag ||
sex(newsta):=sx
END
END;
reportdelete(sta)=……
reportedit(sta)=……
num、sx和ag是形式输入参数,num表示新增加员工的工号,sx表示他的性别,ag是他的年龄,这个操作的一个“实质性的”前条件:STAFF staff≠φ∧num∈NAT∧sx∈SEX∧ag∈NAT1(NAT表示从0开始的自然数,NAT1表示从1开始的自然数),规定了输入参数的类型,只有满足这些条件的情况下才可以合理地激活与之对应的操作,即添加新员工的操作。操作执行最终结束后满足不变式。BToolkit对上面的AMN进行语法分析和类型检查,并可以完成全部的证明义务。
(二)组件接口的产生
每个组件通过接口提供服务并向其他构件请求服务,因此构件接口定义在组件开发中成为关注的焦点。组件可以直接提供接口,或者实现一个客户可访问的对象而由该对象间接提供接口。在B_Toolkit中,B_InterfaceGenerator可以对已经分析过的IMPLEMENTATION(实现)自动产生组件接口的规格说明和代码,成为系统和用户通信的桥梁。接口的规格说明如下:
INTERFACE
Staff
OPERATIONS
add,
delete,
edit
END
接口中只保留了IMPLEMENTATION的OPERATIONS的行为名称,并没有具体实现,实现过程保留在IMPLEMENTATION中。
六、结束语
任何基于组件技术的系统,在开发前期都会面临一定的风险。组件的提取、开发,以及测试都需要耗费相当多的时间。在组件数量众多的情况下,完备的说明文档也是系统成败的关键。但组件的某些功能将减少许多后期工作。例如,尽管组件基础设施对组件的接口有一定的访问能力,但这种能力要求组件必须能够实现一定的服务或遵循构件基础设施所定义的一些规范。目前技术条件已经开始成熟,相应标准也已经出台,这给软件危机的真正缓解带来了希望。基于组件的软件开发必然会成为今后软件开发的趋势。
参考文献:
[1]Tyson, B. Albert, C.Browns word, L.Interpreting Capability Maturity Model Integration (CMMI) for COTS-Based System. (CMU/SEI-2003-TR-022)[R].Pittsburgh,PA: Software Engineering Institute, Carnegie Mellon University,2003.
[2]Crnkovic Ivica, Larsson Magnus. Building reliable component-based software systems [M].London: Artech House publishers, 2002, 97-110.
[关键词]组件 软件工程 软件开发模型
中图分类号:TP311 文献标识码:A 文章编号:1671-7597(2008)1110047-02
一、引言
随着软件复用技术的日臻成熟,利用可复用组件构造软件系统已成为软件开发的主要手段,基于组件的开发(Component-Based Development,简称CBD)和基于组件的软件工程(Component-Base Software Engineering,
简称CBSE)已经成为现今软件重用实践的研究热点。
二、软件组件和基于组件的软件工程
(一)基本概念
组件技术是90年代初出现的一种新技术,它是在结构化设计和面向对象技术的基础上发展起的,是面向对象技术之后的软件开发的标准方法系,是面向对象的开发技术的延伸。因此,组件具有面向对象的特征。一个软件组件是由契约性说明接口和明确的上下文相关性组合的单元。可以被独立地调度,而且常常由第三方开发。组件具有功能独立性、高度的可重用性、与语言和平台无关性等特点。基于组件的软件工程是软件工程进化和发展的产物,因此,它将会使软件开发过程中设计者的主要任务和所需技巧发生很大的改变。
(二)基于组件的软件开发的遵循原则
从基于组件的软件构建方式可以看出,基于组件的软件开发关键在于组件本身的开发,那么组件主要由那几部分构成,开发时又要遵循那些规则。下面给以详细说明:每个组件都是一个独立运行的操作系统任务或进程,它与一般的操作系统应用具有类似的调度和运行环境,组件的功能是由相关的函数实现的,组件的操作方法调用是通过接口实现的。由于每个组件可以承担多个角色,完成多个任务,因此可以为一个组件定义多个接口,每个接口对应不同的接口函数集合。刻画组件需要以下几个基本属性:封装、接口与实现、接口查询。
三、基于组件的软件开发方法
(一)体系结构
软件的体系结构代表了系统公共的高层次的抽象,它是系统设计成败的关键。其设计的核心是能否使用重复的体系模式。传统的应用系统体系结构从基于主机的集中式框架,到在网络上的客户端通过网络访问服务器的框架,都不能适应目前企业所处的商业环境,原因是:
1.企业过分地依赖于某个供应商的软硬件产品,不利于信息共享。
2.不能适应远程访问的分布式、多层次异构系统。
3.封装的应用系统难以维护,也难以满足复杂多变的用户需求。
4.不能实现分析、设计核心功能重用,最多只能实现代码重用。
目前,应用系统已经发展成为在Intranet和Internet上的各种客户端可远程访问的分布式、多层次异构系统。基于组件的软件开发为开发这样的应用系统提供了新的系统体系结构。它是定义标准的、分布式、模块化结构,使应用系统可分成几个独立部分分别开发,亦可采用增量方式开发。
(二)开发过程
归纳起来,组件式的软件开发方法应包括四个方面:首先应对组件有明确的定义;其次要有组件的描述技术和规范,如UML、JavaBean、EJB、Servlet规范等;第三开发应用系统必须按组件裁剪划分组织,包括分配不同的角色;最后要有支持检验组件特性和生成文档的工具,确保组件规范的实现和质量测试。总之,传统的软件方法学是从面向机器、数据、过程、功能、数据流、对象等观点反映问题的本质,是自顶向下进行,对重用没有提供更多的帮助。组件式软件开发是即插即用,它基于体系结构,以接口为中心,将组件有机组合,它把自顶向下和自底向上方法结合起来进行开发。组件技术的三个主要派别:Sun的J2EE平台、Microsoft的COM+、IBM的CORBA,其开发过程皆是如此。
(三)开发组织架构
传统软件的开发组织一般由分析员、设计员、程序员和测试员组成。对一个小的应用系统来说,一个熟练的开发人员,可能兼顾多个角色。但对基于组件的软件开发来说,组件开发与应用系统集成往往是分开进行的,因此整个开发过程由六个角色来完成:
1.组件开发者,也就是组件供应商,组件的提供者。
2.应用组件集成者,针对某个应用领域将已有组件组合成更大的组件模块或容器,作为系统部署的基本单元。
3.应用系统部署者,将系统部署基本单元放入选定的平台环境或基本框架中,完成软件定制的要求。
4.开发平台服务器供应商,提供服务器、操作系统和数据库等基本软件。
5.应用系统开发工具供应商,提供组件公共设施服务。
6.系统管理员,配置硬件、网络和操作系统,监督和维护应用系统者。
每个角色的工作专业性都很强,要兼顾成为多面手很不容易,目前已形成开放的组件市场。在开发过程中,重要的是组织好开发队伍,必须按本企业所具备的人才来组织,尤其是必须在开发初期选好标准框架,以及统一的开发指导方针,保证在整个开发过程中,各角色能随时互相沟通,人员素质决定了组件的重用率。
(四)组件技术实现条件
组件技术的实现必须具备四个条件:
1.要有标准软件体系结构,保证组件间通信协议统一,实现同步和异步操作控制突破本地空间限制,充分利用网络环境。
2.组件有标准接口保证系统可分解成多个功能独立的单元,用组件组装而成。
3.组件独立于编程语言。
4.组件提供版本兼容,以此来实现应用系统的扩展和更新。
四、基于组件的软件开发模型
(一)标识组件
这个阶段的主要工作是将应用程序分解为组件。分解时应特别注意分解后的组件粒度。粒度大的组件更节省工作量,但灵活性较差,改变难度大,丧失了CBSD所带来的好处。粒度小的组件灵活性好,但节省的工作量较小。因此必须在组件大小和灵活性之间做一个折衷。
(二)获取组件
这个阶段的主要工作是根据上一阶段分解后的组件功能从市场购买或从组织内部获得相应的组件。使用现有的组件而不是开发一个新组件,通常是满足一个给定需求最快最便宜的方案。
(三)设计组件
新的组件可以通过多种方式来产生。例如,它们可以从头开发,也可以从现有的应用中抽取,或者对已有的组件进行修改。在这个阶段必须生成一个对接口详细描述的文档。在这一阶段应重点考虑为复用而设计,因为让组件在不同上下文背景中实现复用是我们的一个目标。下面是几个影响复用的设计原则:
1.组件应该包括那些不可分离的部分。如果有两个相互依赖的组件,那么就应该考虑能否合二为一。组件应该有一个一致的目标(它包括体现传统的品质,即高内聚、低耦合)。
2.组件提供的服务应该是上下文无关的。即组件不受调用它们的上下文背景的影响。
3.在定义每个服务时,尽量保持它的目标单一。多重目的的服务将增加维护开销,因为任何的改动不仅影响到要改变的功能,也将影响到其他被捆绑在一起的功能,这增加了出错的可能性和测试的费用。
4.服务的接口应尽可能的小。不要为了将来的需求而加上目前并不需要的参数。未来总是善变的。
5.对服务的命名应该尽量用英文表达出其所完成的功能。
(四)测试组件
对获取、更改和设计的组件进行功能测试。组件的目标是可以用在多种上下文环境中。在它被一个新的环境接受之前,必须确定它是否能正确地按规范说明实现功能。
五、应用示例
下面以某单位人事系统为例,说明组件开始的实际步骤与方法。
(一)组件的规格说明
软件的抽象规格说明用抽象机(AMN)来描述。一个抽象机的形式化描述包含了若干个子句,MACHINE、SETS、VARIABLES、INVARIANT、CONSTANT
-S、PROPERTIES、DEFINITIONS子句构成了系统变量的状态和属性等静态行为的描述。
员工组件的属性规格说明如下(其中封装了员工个人信息全部属性:姓名、工号、性别、年龄等):
MACHINE
Staff
SETS
STAFF;
SEX={male,female}
VARIABLES
Staff,number,age,sex
INVARIANT
staffSTAFF∧
number∈staff→NAT∧
age∈staff→NAT1∧
sex∈staff→SEX
INITALIZATION
staff:=φ||
sex:=φ||
age:=φ||
number:=φ||
MACHINE表示组件名。SETS子句定义两个集合:第一个延期集合STAFF,表示所有可能的(现在和未来的)员工;第二个枚举集合SEX,表示员工的性别(male或者female)。VARIABLES子句引进该机器的状态变量名,变量staff是集合STAFF的子集,它包含了那些已经将有关信息有效地存入数据库中的员工,number表示员工的工号,age对应员工的年龄,sex代表员工的性别。
员工组件提供三个操作:添加记录操作add(num,sx,ag),删除记录操作delete(sta),修改记录modify(sta)。下面给出了add(num,sta)操作的完整规格说明,其他操作省略:
OPERATIONS
add(num,sx,ag)=PRE
STAFF-staff≠φ∧
num∈NAT∧
sx∈SEX∧
ag∈NAT1
THEN
ANY newsta WHERE
Newsta∈STAFF_staff
THEN
staff:=staff∪{ newsta }||
number(newsta):=num ||
age(newsta):=ag ||
sex(newsta):=sx
END
END;
reportdelete(sta)=……
reportedit(sta)=……
num、sx和ag是形式输入参数,num表示新增加员工的工号,sx表示他的性别,ag是他的年龄,这个操作的一个“实质性的”前条件:STAFF staff≠φ∧num∈NAT∧sx∈SEX∧ag∈NAT1(NAT表示从0开始的自然数,NAT1表示从1开始的自然数),规定了输入参数的类型,只有满足这些条件的情况下才可以合理地激活与之对应的操作,即添加新员工的操作。操作执行最终结束后满足不变式。BToolkit对上面的AMN进行语法分析和类型检查,并可以完成全部的证明义务。
(二)组件接口的产生
每个组件通过接口提供服务并向其他构件请求服务,因此构件接口定义在组件开发中成为关注的焦点。组件可以直接提供接口,或者实现一个客户可访问的对象而由该对象间接提供接口。在B_Toolkit中,B_InterfaceGenerator可以对已经分析过的IMPLEMENTATION(实现)自动产生组件接口的规格说明和代码,成为系统和用户通信的桥梁。接口的规格说明如下:
INTERFACE
Staff
OPERATIONS
add,
delete,
edit
END
接口中只保留了IMPLEMENTATION的OPERATIONS的行为名称,并没有具体实现,实现过程保留在IMPLEMENTATION中。
六、结束语
任何基于组件技术的系统,在开发前期都会面临一定的风险。组件的提取、开发,以及测试都需要耗费相当多的时间。在组件数量众多的情况下,完备的说明文档也是系统成败的关键。但组件的某些功能将减少许多后期工作。例如,尽管组件基础设施对组件的接口有一定的访问能力,但这种能力要求组件必须能够实现一定的服务或遵循构件基础设施所定义的一些规范。目前技术条件已经开始成熟,相应标准也已经出台,这给软件危机的真正缓解带来了希望。基于组件的软件开发必然会成为今后软件开发的趋势。
参考文献:
[1]Tyson, B. Albert, C.Browns word, L.Interpreting Capability Maturity Model Integration (CMMI) for COTS-Based System. (CMU/SEI-2003-TR-022)[R].Pittsburgh,PA: Software Engineering Institute, Carnegie Mellon University,2003.
[2]Crnkovic Ivica, Larsson Magnus. Building reliable component-based software systems [M].London: Artech House publishers, 2002, 97-110.