面向对象技术提供了一种新的认知和表示世界的思想和方法,它对计算机工业的影响是深远的。计算机从业人士利用它提出了面向对象的计算机程序设计语言、面向对象的软件设计方法、面向对象的数据库等等。同时面向对象技术为软件工业实现工程化提供了强有力的支持,正是面向对象技术造就了组件、构件、中间件等概念。
1 可重用软件组件
计算机的不断发展为计算机及网络应用提供了大量技术先进、功能强大的应用软件系统,同时也给软件开发者和用户带来了相应的问题:
· 软件系统规模庞大,研制周期长,维护费用高;
· 软件系统过于复杂,在一个系统中集成了各种功能,大多数功能不能灵活地装卸、单独升级或重复利用;
· 应用软件不易集成,即使各应用程序是用相同的编程语言编写的,并且运行在相同的计算机上,特定应用程序的数据和功能也不能提供给其他应用程序使用。
为克服上述困难,实现全行业范围内的软件"即插即用",关键是解决软件系统的可操作性、可扩展性、语言独立性和跨平台的操作能力。
作为解决这类问题的一种方案,面向对象的程序设计思想20多年来得到很大发展。孤立的面向对象思想虽然功能强大,但目前其发展已接近极限,结果是产生了大量的"对象孤岛"。将面向对象思想与组件编程思想相接合发展起来的基于对象的组件软件结构为这一领域开辟了新的道路。
从广义上说,软件组件是一种定义良好的独立、可重用的二进制代码,包括功能模块、被封装的对象类、软件框架和软件系统模型等。
本世纪60年代末到80年代初,结构化的模块式软件开发思想占主导地位,当时的组件的含义是指一些定义良好的方法包或功能模块。
80年代起,面向对象的软件开发思想迅速发展起来,这时的软件组件的含义就是类库。类虽然提供了封装性、多态性和继承性,但需要依赖于具体的编程语言,耦合度高,且需要用户对类库的结构和宿主语言有较深入的了解,因此,不能完全达到软件重用的可移植性和互操作性要求。
90年代后,组件的内涵进一步加强,聚合性、独立性和重用性进一步提高。目前,基于对象的组件软件体系结构中的组件是指可方便地插入到语言、工具、操作系统、网络系统中的二进制代码和数据。
这种软件组件可以看作是一种软件集成电路元件,具有以下特点:
· 软件IC没有硬件IC的天然聚合性,构成粒度大小自由,便于扩展;
· 通过规定一个统一的二进制标准,建立起机构之间的智能互操作机制和语言独立性;
· 外界仅通过接口访问组件;
· 多侧面性,即组件表达的语义层次高,可以从不同侧面进行连接,外部特性不唯一;
· 支持封装、继承、多态性。
基于经典面向对象技术的组件模型为软件体系结构设计和大型应用软件开发给予了强有力的支持,目前已经为软件行业所广泛接受。Microsoft的OLE/COM和SunSoft的JavaBeans都是典型的软件组件规范。
1.1 JavaBeans
Java Bean是基于Java环境的,可视的、可操纵的、可重用的组件;JavaBeans组件模型是SunSoft制定的关于Bean的软件组件标准,规定设计所有Bean所依据的框架,确保Bean在具备特定功能的同时,还能被可视化软件构造工具所识别、操纵,并能将这些设计信息保存下来,指导运行时的行为。
作为可视化组件,所有JavaBean都具备如下特征:
· 内省(introspection)机制,能够告诉软件构造工具其所能完成的功能,从而允许软件构造工具在设计时对其加以操纵;
· 用户定制(customization)机制,允许程序员在软件开发阶段利用软件构造工具改变Bean的外观和行为方式。
· 事件(event)机制,能捕捉事件、引发事件,并将其所能产生和处理的事件告知软件构造工具。
· 特性(properties)机制,除在软件开发阶段支持用户定制外,还使得软件系统能够在运行时刻对Bean进行加工和控制;
· 保持(persistence)机制,保存程序员开发时利用构造工具对Bean所做的修改,并在运行时予以恢复。
· 设计时刻功能和运行时刻功能分离。
JavaBean主要用于可视化环境,为软件构造工具所利用,但也能通过程序接口直接操纵,Java类库中提供了相应的控制类。
1.2 OMA/CORBA
对象管理集团OMG (Object Management Group)是一个国际性的软件行业协会,主要宗旨是促进面向对象的方法在软件工程中的应用,以及在面向对象的软件工程方法学的基础上,为大规模并行系统(开放式并行计算)软件的开发与应用制定软件体系结构模型和通用接口规范。
OMG 于1990年末提出了一个对象管理结构的基准结构OMA (Object Management Architecture)。OMA主要涉及用于面向对象语言、系统、数据库及应用程序框架的统一术语体系,面向对象软件系统的抽象框架和基于面向对象技术的分布式软件系统参考模型等。为了构造上述参考模型,OMA规定了四个方面的标准:
1. 对象请求代理ORB (Object Request Broker),即关键通讯单元,在不同的应用程序对象之间以高度协同的方式发送消息;
2. 对象模型,即独立设计的、可移植的抽象模型,可以与其他符合OMA规范的面向对象系统进行通讯;
3. 对象服务,利用ORB实现基本对象功能,确定对象的逻辑模型和物理存储方式;
4. 通用组件,包含了适用于很多应用领域的基本功能,这些功能可以通过符合OMA规范的类接口获得。
OMG 于1991年末提出的CORBA (Common Object Request Broker Architecture),是OMA参考模型中的ORB接口技术规范。这一标准规定了如何定义、创建、调度、引用对象,以及对象之间如何通讯。符合CORBA规范的ORB是典型的中间件,允许Client对象向Service对象发出请求。
CORBA规范的基本组成如图所示
主要包括:
· 对象请求代理ORB (Object Request Broker),是CORBA的核心。作为一个软件组件,对象可以通过ORB发出请求并接收响应。在CORBA中,所有的通讯都通过ORB进行,因而无论一个对象是本地的还是远程的,对于与之进行通讯的其他对象来说都是等价的。CORBA并没有规定如何具体实现一个ORB,几乎每一个不同的产品都有其具体的ORB实现。
· 接口定义语言IDL (Interface Definition Language),是用于描述对象接口的一种高级符号语言。IDL不涉及任何接口的实现细节,所有COBRA系统都根据IDL用某种特定语言来实现接口。CORBA为C、C++、Smalltalk和JAVA制定了规范,ADA95和COBOL的映射规范也正在制定中。IDL描述通常以接口库(Interface
Repository)的方式进行存贮。
· 接口库(Interface Repository),其中包括了所有描述服务对象属性、操作、自定义数据类型及异常处理的IDL定义。
· 基本对象适配器BOA (Basic Object Adapter),描述了ORB和服务器端应用程序之间的接口。BOA负责调度服务器端应用程序维护的对象,并与服务对象交换消息。
· 静态请求接口SII (Static Invocation Interface)。SII假设在编译时刻客户对象能够明确了解服务对象的接口,即客户与服务器之间的关系应当是可知的、固定的,服务接口的任何改变都会导致软件系统的重新编译。SII是由IDL描述的。
· 动态请求接口DII (Dynamic Invocation Interface)是一组与服务器无关的通用接口。与新服务对象及其行为相关的信息可以通过接口库获得,客户程序根据这些信息可以在运行时刻动态构造请求。DII使得开发智能化即插即用的软件系统成为可能,但需要涉及大量CORBA
API调用,增加了软件的复杂度。
总之,CORBA提供了一个集成框架,应用程序只要给出用接口定义语言IDL (Interface Definition Language)书写的界面,就可插入框架,与其他对象协同工作,为在分布式环境下实现不同应用程序即插即用的集成提供了有力支持。
1.3 OLE/COM
与CORBA一样,Microsoft的OLE/COM是基于分布式对象模型的开放标准,得到多系统软件开发商、独立软件开发(ISV)商和用户的支持。
OLE实际上是建立在组件对象模型(COM)基础上的一组高层次技术。从基本中间件功能视图的角度来说,COM与CORBA非常相似,同样支持对象的定义、创建、调度、引用及对象之间的通讯,同样提供了接口定义语言(IDL)。
但是两者之间也存在显著的差异。例如,COM支持由不同程序设计语言或不同编译器实现的对象之间的二进制兼容,以及OLE Automation等。
服务控件管理SCM (Service Control Manager)集中负责搜索服务对象和在客户与服务器之间建立信道。当客户向某个特定的对象发出初始化请求时,SCM判断包含该对象的服务程序是否已经运行,如否,则通过注册表查找服务程序所在的位置。随后,客户端SCM建立起与服务器端SCM连接的RPC信道;服务器端SCM也进行同样的处理,并在必要的情况下起动服务程序。最后,信道两端的SCM分别将代理程序(proxy
stub)载入到客户进程和服务器进程中。
OLE/COM提供了与CORBA IDL类似的高级描述语言,用于定义COM概念上的接口,即一组逻辑相关的操作或方法。
OLE/COM结构的另一要素是Automation,允许客户程序动态构造请求(包括方法名、相关参数的类型和取值等),并将请求发送到远端对象。在CORBA中,客户程序能够通过接口库(repository)获取对象接口的相关信息;而OLE/COM则更进一步,任何符合OLE/COM规范的对象都能自动提供其所能支持的接口信息。
|