1.2 组件定义及与其相关概念的澄清

那么,到底什么是组件呢?框架又是什么意思?类是组件吗?控件又指什么?元件、构件这些概念又如何理解?

这些概念,都没有一个统一的标准答案,因此在软件开发过程中,这些术语经常被混淆,笔者根据自己的工作体会,对这些概念解释如下:

对象

面向对象语言(Object-Oriented Language)是一种以对象作为基本程序结构单位的程序设计语言,指用于描述的设计是以对象为核心,而对象是程序运行时刻的基本成分。对象都具有状态和行为。对象,也被翻译为实例、物件。

面向对象的概念。类是一种对包括数据成员、函数成员和嵌套类型进行封装的数据结构。在程序运行期间,由类创建成对象的过程,被称为类的实例化。因此,对象是个运行期的术语,类是个编译期的术语。类本身就是可重用的直接实现手段。

控件

控件的英文是Control,控件就是具有用户界面的组件。要说得具体一点,就得回顾早期Windows的历史根源,当时控件指任何子窗口:按钮、列表框、编辑框或者某个对话框中的静态文本。从概念上讲,这些窗口——控件——类似用来操作收音机或小电器的旋钮和按钮。随着控件数量的增加(组合框、日期时间控件等),控件逐渐成为子窗口的代名词,无论用在对话框中还是用在其他种类的主窗口中。没过多久Basic程序员开始编写他们自己专用的控件,自然而然地,人们便想到共享这些控件。共享代码的方法之一是通过磁盘拷贝,但显然效率低下。必须要有一种机制使开发者建立的控件能够在其他程序员的应用中轻而易举地插入,这便是VBA控件、OLE控件、OCX及至最终ActiveX控件产生的动机。因此,控件是组件的一个主要样本(并且历史上曾驱动着组件的开发),控件又不仅仅是唯一的一种组件。

元件

元件是个电子行业的术语,是电子元件的简称。也有一些软件借用这个术语,指特定的可重用控件。

构件

构件是系统中实际存在的可更换部分,它实现特定的功能,符合一套接口标准并实现一组接口。构件代表系统中的一部分物理实施,包括软件代码(源代码、二进制代码或可执行代码)或其等价物(如脚本或命令文件)。

通常认为,构件是特定软件开发环境中、满足指定规范的软件部分,涵盖了设计、开发、物理等范畴。

框架

框架的英文是Framework,框架是一个应用程序的半成品。框架提供了可在应用程序之间共享的可复用的公共结构。开发者把框架融入他们自己的应用程序,并加以扩展,以满足他们特定的需要。框架和工具包的不同之处在于,框架提供了一致的结构,而不仅仅是一组工具类(摘自《JUnit in action中文版》)。

子系统

子系统是个在设计中使用的术语,英文是SubSystem。在软件总体架构中,按照功能划分子系统。通常一个子系统包含一个或多个进程。

模块

模块也是个在设计中使用的术语,英文是Module。模块指一个子系统内部,按照软件结构分解的功能部分。模块会包含多个类、使用多个组件,也会与框架交互。

那么组件是什么呢?

组件

类本身是个细粒度的可重用实现,为了解决功能或机制层面更大粒度重用的问题,又引入了组件的概念。组件的英文是Component,其逻辑结构如图1-2所示。

图1-2 组件逻辑结构图

组件对外暴露一个或多个接口,供外界调用。组件内部由多个类来协同实现指定的功能。对于复杂的组件,会包括很多类,还可能包含配置文件、界面、依赖的库文件等,组件也可以包含或者使用其他的组件,构成更大粒度的组件。

一些特定范畴的组件,由软件厂家或者国际权威组织制定并颁布了组件规范,如COM、ActiveX、EJB、JavaBean等。本书讨论的组件,指一般意义的自定义组件,不包括这些规范化的组件。

一个真正的软件系统,会涉及以上多个概念,典型的软件系统静态结构如图1-3所示。

图1-3展示了一个软件系统,包括2个子系统:子系统1和子系统2,其中,子系统1调用子系统2。

图1-3 软件系统静态结构

子系统1包含2个模块:模块1和模块2。模块1由两个类(Class 1和Class 2)和一个组件(组件1)构成,模块2由两个类(Class3和Class4)和两个组件(组件2和组件3)构成,模块2提供一个接口给模块1调用。模块1和模块2都使用了框架1。

子系统2包含2个模块:模块3和模块4。模块3由两个类(Class5和Class6)和一个组件(组件4)构成,模块4由一个类(Class7)和一个组件(组件5)构成。模块4提供一个接口给模块3调用。模块3和模块4都使用了框架2。