点评主流软件开发技术
软件构件技术
所谓软件构件化,就是要让软件开发像机械制造工业一样,可以用各种标准和非标准的零件来进行组装。软件的构件化和集成技术的目标是:软件系统可以由不同厂商提供的,用不同语言开发的,在不同硬件平台上实现的软件构件,方便地、动态地集成。这些构件要求能互操作,它们可以放在本地的计算机上,也可以分布式地放置在网上异构环境下的不同结点上。
面向对象的方法和技术是继结构化方法之后出现的、最有代表性的软件开发方法,是当今软件开发的主流技术。但是,面向对象所提供的优点主要是针对分析、设计和源代码等软件开发阶段的,当一个面向对象的代码经过编译、连接后得到的可执行软件则是不可改变的、无法重用的。
因此,我们需要一种新的、不依赖于某种特定语言的、在二进制代码级可复用的软件“对象”,这种“对象”就是构件(Component)。
构件技术是一种软件实现的技术和方法,是对面向对象方法在二进制代码级的完善和补充。构件是由接口构成的,它把接口和接口的实现分离开了。接口是独立于语言的一种描述,它将内部的实现以及接口到实现的映射都封装起来了,外界只能通过接口描述使用构件。因此,接口用哪种语言实现也就无关紧要了。
在现有的软件市场上,有三种代表性的构件技术流派,它们分别是COM(ComponenttModel,对象构件模型)、JavaBean和CORBA(the Common t RequestBrokerArchitecture,公共对象请求代理体系结构)。它们是由不同的机构提出的构件技术实现模型和标准,各有优缺点。
COM
COM是由Microsoft公司推出的构件接口标准,是软件构件相互通信的一种方式,它是一种二进制和网络标准,允许任意两个组件互相通信。目前已有大量的基于COM的构件可供复用,原则上讲,这些构件可以建立在任何环境下,但现有的COM构件大多都依赖于Microsoft环境,在Unix、Macintosh等其他操作系统环境下可复用的构件还很少,Microsoft公司正在努力开发更多的在其他操作系统环境下的COM构件。
传统的应用程序在源代码级可被分割为文件、模块、类或函数等,以便于实施、修改和维护,但经编译、链接以后就生成了不可改变的二进制可执行代码,采用COM技术产生的源代码则不同。
一个COM构件是由若干个接口组成的,而一个接口则是由若干个函数的说明组成的。COM是一个二进制标准,即接口编译以后生成的二进制代码的结构要满足一定的内存块结构。该内存块结构是不依赖于任何语言的。图1表示一个拥有Fun1和Fun2函数的IX接口的内存块结构。
其中,pIX是指向IX接口的指针,通过vtbl指针(接口指针)指向接口中函数的指针数组(称为v表),v表中的元素是指向接口中函数实现的指针。后面我们将会看到函数指针在用代理-存根机制实现进程间、计算机间的接口调用时指向相应的代理。
任何语言的语法成分,只要其编译后的目标代码在结构满足图1的二进制形式结构,就称其为该构件接口的一个实现。通常情况下,大多数程序设计语言和其COM支持工具都能将相应的语法自动地映射为这样的结构,无需程序员做更多的工作。
COM是一个二进制标准。由于任何语言都要翻译成二进制机器代码才能最后执行,所以COM可以作为各种高级语言的中间桥梁,使它们可以互操作;按COM标准实现的软件也可以被所有的语言环境所共享。共享人类开发的、丰富的软件资源是提出的COM的最初动机。
JavaBean
目前的COM技术主要是针对PC市场的不依赖于语言的软件构件技术,而JavaBean则是针对解决平台依赖性和语言依赖性这两个问题而提出来的软件构件技术标准。
关于平台依赖性问题是其他构件标准普遍存在的问题。尽管其他构件标准的接口是惟一的,即使用构件的方式是惟一的,但一个构件一旦在某种运行环境下实现就很难直接在另一种运行环境被复用。而这种平台依赖性问题对进一步提高软件复用力度却是至关重要的。
由于Java本身在全球软件界的影响,特别是Java独立于平台的、适宜于在Internet、易于构造B/S应用等等特点,Javasoft公司利用Java特殊的byteCode机制,很好地解决了其他构件标准难以解决的平台依赖性问题,推出了它们自己的构件接口标准JavaBean。正像JavaSoft所描述的JavaBean是“一次性编写,在任意地方可运行,在任意地方可重用”。
JavaBean的构件模型主要包括:构件和容器。模型的其他部分还包括事件处理、持续性、布局以及应用程序建立器(一种可视化的工具)等,这些都是通过JavaBean构件的标准接口实现的。
JavaBean构件有时也称为JavaBean或Bean。它是由接口构成的,接口是由方法组成的。容器能够使构件组合在一起并相互作用。这种机制主要是为了界面构件提出的,它本身也是一个构件,以便嵌套组合产生复杂的可视化GUI。JavaBean的主要特征为:
1. 属性管理
根据属性的使用类型可将其分为:一般属性、索引属性、依附属性和约束属性,通过一些标准的命名约定定义它们相应的访问方法,使JavaBeanAPI能用统一的方式对属性进行管理。其中,依附属性是基于自身值的变化而向感兴趣的部分提供通知的属性。约束属性是一种在接收更改之前能使感兴趣的部分对新属性值执行有效检查的属性。
2. 内省功能
内省功能是构件的内部结构(属性、方法和事件)展现给外部的机制。不同于COM,JavaBean不需要构件开发者开发这种额外的工作,它只需要开发者对构件的属性、方法和事件的命名和类型符号遵守一个约定,通过标准的JavaBeanAPI就可了解到bean的任何内部信息。
JavaBean的事件处理模型是基于现存的AWT事件处理模型的。它决定bean如何对它自身状态的变化做出反应,以及决定如何将这些变化传递给应用程序和其他bean。通过JavaBeanAPI将一个事件接收器(处理某个事件的应用程序或其他bean)注册到该事件上,完成外部对事件的控制。这是将bean组合起来的有效方法。
Java与JavaBean的区别是:Java是在源代码级的复用;而JavaBean是在目标代码级的复用,并且,通过JavaBean提供的标准接口,为在目标代码级的动态组装、版本升级、维护提供保证,并可利用一些相应的可视化工具方便、有效地定制JavaBean和建立应用程序。
尽管JavaBean是作为一种通用的构件模型提出来的,但它更主要地还是为解决可视化构件而设计的一套系统,它类似于Microsoft的ActiveX。严格地讲,目前的JavaBean在不同语言之间提供的互操作性方面是很弱的,它只是提供了在Java环境下的二进制代码共享机制。增强JavaBean与其他构件技术之间的互操作是JavaBean今后发展的一个主要课题。
CORBA
CORBA是由OMG(对象管理组)1990年首次为了解决分布式、异质的软件和硬件环境下对象之间的互操作问题而提出的、基于中间件的构件技术。CORBA有两个重要的特点:面向对象技术与分布式计算的结合;代理机制的中间件技术。
1. 面向对象与分布式技术的结合
CORBA是为了解决分布式问题而提出的分布式对象计算模型。利用计算机网络进行分布式计算可以共享资源、平衡大型计算的负载等。但是,传统的分布式计算模型还不够成熟:客户/服务关系不灵活、远程服务层次太低、用户使用不透明。面向对象中的对象是一个相对独立的软件实体,它有自己的内部状态和清晰的对外接口。但传统的面向对象模型的实现,只能在单计算机上进行。CORBA将这两者有机地结合起来了。在CORBA中,对象是分布式计算模型中理想的节点描述模块,对象既可以是“客户”,也可以是“服务器”,它可自由地分布于计算机网络上。通过CORBA,对象可网络透明地相互访问,CORBA屏蔽了位置信息和计算机的软硬件环境,因此,CORBA建立了一个统一的分布式软件开发平台。
2. 代理机制的中间件——对象请求中介(t Request Broker,简称ORB)
作为一种构件技术,CORBA要解决的另一个重要问题是二进制代码之间的互操作问题。
不同于COM/DCOM技术,CORBA提供了一种中间的代理机制,将构件的接口与构件的实现分离开了。服务对象实现后,就将其接口登记在CORBA的代理中,客户对象按照代理中的接口描述访问服务对象,而不关心服务对象使用什么语言、在什么地方、在什么软硬件环境下实现的。这些工作都由代理自动地、透明地为客户对象完成。这种机制还可提供客户与服务器之间动态匹配、一个服务器为多个客户服务等功能。
ORB提供的机制是良好的,也提供了足以使客户和服务器通信的服务,但这些服务是很低级的。用户要熟练地掌握它们不是一件容易的事情,而且这些繁锁的过程经常重复。因此,CORBA对经常使用的服务封装内部的细节,提供简化用户使用的、方便的、标准的对象服务。对象服务是CORBA非常重要的一部分,是对ORB功能的扩充和补充。CORBA提供的15种服务可分为三大类:分布式系统相关的服务,如命名服务、事件服务、安全性服务和交易器服务;数据库相关的服务,如事务处理、属性、集合、关系、查询、持久性、外表化、并发等服务;一般服务,如生命期、计时、特许等服务。大多数应用都是在这些服务的基础上建立的。
公共设施是CORBA提供的另一种比对象服务更高一层的框架服务。它是特定应用领域的框架复用,如复合文档构件设施等。CORBA的公共设施还很少,还有大量的设施需要集成,如图形系统、移动代理等。
CORBA没有定义二进制代码的标准,而是在高层定义了一个标准的接口描述语言IDL,并通过扩展机制提供各种语言到IDL之间的映射,以IDL为中间的桥梁,达到各种语言之间的互操作。
三种构件模型的特点
COM是一种二进制标准的构件技术,它实现简单、实用,但要完成真正意义的、独立于硬件和操作系统的二进制标准,还有大量的工作要做。目前,COM还只是Microsoft环境下的二进制标准。
CORBA是一种以IDL为桥梁、基于ORB的中间件的构件技术。它是以IDL为标准的,与实现构件接口的语言、软件平台和硬件平台无关。但它却无法支持Internet上大量的移动计算的需求,一个构件的实现是与软硬件平台相关的,即一个构件的实现是不能在网上移动的。
JavaBean是一种能提供在网上移动的构件技术,它通过bytecode技术,提供在“任何地方运行,任何地方重用”的功能,但它却是与语言相关的。
从软件体系结构的角度看,构件技术中的构件只是提供一个软件模块的实现,作为一个软件系统,它还需要连接子(connector)将软件模块组织成一个整体。有各种各样组织软件模块的形式:管道和过滤器、层次、基于事件的隐式调用等等。管道和过滤器模型最容易实现软件模块的集成,但只能处理简单的、流式的应用,没有普遍性。层次模型可提供不同级别的抽象,但层与层之间存在着紧密的耦合,而且,这种模型也没有普遍性。基于事件的隐式调用的方式是,构件向系统发出请求,已经向系统注册响应该事件的构件就响应该事件。这种模型将调用者和被调用者彻底地分开,这种软件体系结构模型具有很强的灵活性,也具有通用性。
构件技术的初衷是为了能充分地利用在各种环境下,用各种程序设计语言开发的软件模块而提出的一种二进制代码级的软件复用技术。通过接口这种不依赖于具体语言的中性机制,使各种语言之间可以互操作,也就是说一种语言可通过接口访问另一种语言开发的软件,而不需要移植工作,这大大地提高了软件的复用程度。