在任何行业中,复杂情况通常是通过应用很多关键概念来解决的。这些概念是通过像抽象、分解、迭代和细化这们的方法来表达的。其中的关键是分解技术---把一个较大的问题分解成较小的、可管理的单元,那样每一个单元都可以单独处理。这个技术是软件工程的许多方法的核心。这些方法可以称为结构化设计、模块化编程或面向对象,它们产生的单元称为模块、包或构件。
最近,人们开始关注于通过有计划地集成现有的软件部分来进行软件开发。这通常称为基于构件的开发(Component-Based Development, CBD)或基于构件的软件工程(Component-Based Software Engineering, CBSE),而其中的各个部分称为构件,在此我们通称为面向构件。
一. 什么是构件
关于到底什么是构件、什么不是构件的问题有很多不同意见,但无论如何,CBD的基本是从定义良好、独立开发的部分来建立系统。对于CBD而言,构件远非模块化编程方法中的子程序、面向对象方法中的对象或类、或系统模型中的包。在CBD中,构件的概念既包含了这些思想又扩展了它们。构件是设计、实现以及维护基于构件的系统的基础。现在我们将采用一个相当广泛、全面的构件定义:
构件是一个独立发布的功能部分,可以通过它的接口访问它的服务。
这个定义强调了构件的很多重要方面。第一,它将构件定义为一个可交付的单元。第二,构件会提供一些有用的功能,这些功能集合到一起会满足一些需求。这些功能的设计符合一些设计准则。第三,构件通过接口提供服务。
二. 构件和对象
图2.1构件和对象之间的关系 |
考察对象和构件的关系,为理解构件方法提供了一个很好的起点。构件可以认为是一种包装对象实现的简便方法,并且可以使它们组装成一个更大的软件系统。如图 2.1 所示,构件可以看作是在构件模型的环境中的一个或多个对象的实现。这种构件模型定义了一套构件必须遵守的规则,使其它对象可以访问那些对象实现。经外,它描述了一套标准服务,这些服务是构件和构件系统组装工具可以利用的(如构件及操作的命名,对那些操作的访问安全性、事务管理等等)。
各个组织可以基于客户的需求和它们所使用的构件工具来定义自己的构件模型,现在有很多广泛使用的构件模型标准,如Sun Microsystems的Enterprise JavaBeans(EJB)标准和Microsoft的COM+标准。
总的来说,构件和对象的区别主要在以下三个方面:
- 构件担当一个部署单元的作用,它是基于构件模型的,这种模型定义了符合这种模型的构件所要遵循的规则。
- 构件提供了对一个或多个对象实现的包装。
- 构件是一个组装单元,它用于从很多独立创建的功能部分设计和构建系统,每一个部分都潜在地使用一种面向对象编程语言(Object-Oriented Programming Language, OOPL)或某种其他技术创建。
三. 对构件概念的深入理解
为了能够对多种特定的构件技术和开发方法加以比较和对比,需要对构件的特性加以更为细致的分析。为此,人们开发了一种构件的高层概念模型,这种概念模型涵盖了构件的许多重要特征。我们考虑了三个关于什么是构件的观点,它们能体现出构件的许多有意义的特征:
1. 包装的观点:将构件作为包装、分发、交付的单位。一个构件可以看作是一个组织的概念,也就是作为一个独立单元加以复用的许多不同元素的集合。这里的重点是复用,关注于对构件的包装。
2. 服务的观点:构件是一系列服务的提供者。在此将构件视为为使用者提供服务(操作或功能)的软件实体。这里的重点是将构件视为服务的提供者,强调了一系列服务的提供者和使用者之间共同遵守和使用的契约的重要性:各种服务必须通过接口来提供。此种观点关注于将构件的规格说明和实现加以区分,这意味着当构件升级或替换时,应用系统不需要作任何改动。
3. 完整性的观点:构件是数据的集成或包装的边界。这一规范是构件可替换的必要条件,它强调了构件在实现上的独立性。
图2.2三种构件观点 |
图 2.2 描述了构件的三种观点之间的关系,并且通过引入接口、构件规格说明以及模型元素充实了这种简单的概念模型。其中每人观点都建筑在另一个之上。例如,服务观点说是 包装观点的特化。