基于构件的软件工程(Component-Based Software Engineering,CBSE)是一种基于分布对象技术、强调通过可复用构件设计与构造软件系统的软件复用途径。基于构件的软件系统中构件可以是COTS(Commercial-Off-The-Shelf)构件,也可以是通过其他途径获得的构件(自行开发)。CBSE体现了“购买而不是重新构造”的哲学,将软件开发的重点从程序编写转移到了基于已有构件的组装,以更快地构造系统,减轻用来支持和升级大型系统所需要的维护负担,从而降低软件开发的费用。
用于CBSE的构件应该具备以下特征。
(1)可组装型:对于可组装的构件,所有外部交互必须通过公开定义的接口进行。同时它还必须对自身信息的外部访问。
(2)可部署性:软件必须是自包含的,必须能作为一个独立实体在提供其构件模型实现的构件平台上运行。构件总是二进制形式,无须在部署前编译。
(3)文档化:构件必须是完全文档化的,用户根据文档来判断构件是否满足需求。
(4)独立性:构件应该是独立的,应该可以在无其他特殊构件的情况下进行组装和部署,如确实需要其他构件提供服务,则应显示声明。
(5)标准化:构件标准化意味着在CBSE过程中使用的构件必须符合某种标准化的构件模型。
CBSE过程是支持基于构件组装的软件开发过程,需要考虑构件复用的可能性,以及在开发和使用可复用的构件中所涉及的不同过程活动,成功的构件复用需要一个经过裁剪、适配的开发过程,以便在软件开发过程中包含可复用的构件。
CBSE过程中的主要活动包括: (1)系统需求概览; (2)识别候选构件; (3)根据发现的构件修改需求; (4)体系结构设计; (5)构件定制与适配; (6)组装构件,创建系统。
构件组装是指构件相互直接集成或是用专门编写的“胶水代码”将它们整合在一起来创造一个系统或另一个构件的过程。常见的组装构件有以下3种组装方式。
1、顺序组装
通过按顺序调用已经存在的构件,可以用两个已经存在的构件来创造一个新的构件。顺序组装的类型可能适用于作为程序元素的构件或是作为服务的构件。需要特定的胶水代码,来保证两个构件的组装:上一个构件的输出,与下一个构件的输入相兼容。
2、层次组装
这种情况发生在一个构件直接调用由另一个构件所提供的服务时。被调用的构件为调用的构件提供所需的服务。因此,被调用构件的“提供”接口必须和调用构件的“请求”接口兼容,如果接口相匹配,则调用构件可以直接调用被调用构件,否则就需要编写专门的胶水代码来实现转换。
3.叠加组装
这种情况发生在两个或两个以上构件放在一起来创建一个新构件的时候。这个新构件合并了原构件的功能,从而对外提供了新的接口。外部应用可以通过新接口来调用原有构件的接口而原有构件不互相依赖,也不互相调用。这种组装类型适合于构件是程序单元或者构件是服务的情况。 当创建一个系统时,可能会用到所有的构件组装方式,对所有情况都必须编写胶水代码来连接构件。
而当编写构件尤其是为了组装来写构件时,经常可能会面临接口不兼容的问题,即所要组装的构件的接口不一致。一般会出现3种不兼容情况。
(1)参数不兼容。接口每一侧的操作有相同的名字,但参数类型或参数个数不相同。
(2)操作不兼容。提供接口和请求接口的操作名不同。
(3)操作不完备。一个构件的提供接口是另一个构件请求接口的一个子集,或者相反。
针对上述不兼容情况,必须通过编写适配器构件来解决不兼容的问题,适配器构件使两个可复用构件的接口相一致;适配器构件将一个接口转换为另外一个接口。 当用户选择组装方式时,必须考虑系统所需要的功能性需求、非功能性需求,以及当系统发生改变时,一个构件能被另一个构件替代的难易程度。