UML软件工程组织

对COM/DCOM、CORBA和Java Beans的全面比较
2006.09.30   来源: 抚剑观书的BLOG

本文分别对COM/DCOM、CORBA和Java Beans在“相关背景”、“基本概念”、“技术内容及特点”三个方面进行对比。

 一、相关背景的比较

 COM/DCOM

 为了适应更加复杂应用的需要,Microsoft公司推出了构件对象模型COM,COM支持同一台计算机上不同进程间对象的调用;由于分布式处理系统的广泛应用和与CORBA竞争的需要,Microsoft公司于1997年推出了COM的分布式版本,即DCOM,支持对象间通过网络(包括局域网、广域网、因特网)进行通信。

CORBA

 CORBA(Common Object Request Broker Architecture公共对象请求代理体系结构)是由OMG工业集团定义的分布对象计算模型和系统结构。OMG与1990年提出了一个对象管理结构(OMA),这是CORBA的最原始的构想及基础。在OMA的基础上,1991年一些大公司联合提出了CORBA1.1版。目前有不少公司从事CORBA的实现工作,并推出了基于CORBA的产品。
CORBA仅是一个分布对象规范,没有限定使用何种程序设计语言,其目的是不使CORBA束缚在某种特定程序设计语言上。用不同语言书写的对象,只要符合CORBA规范,就可以相互调用。但由于CORBA规范仅是一个书面的说明,各公司对其理解未必一致,规范中也有不少部分没有做统一规定,由厂家自行决定,因此各厂家基于CORBA的产品未必相互兼容。

Java Beans

 Java Beans是于1996年提出的基于Java语言的分布对象模型,其构件叫Bean。Bean就是以Java语言中的类和对象为基础定义的。当初,Java Beans主要为一些软件构造工具提供一些可视化构件。后经不断扩充,发展成为一种通用分布对象模型。但是,Java Beans不如CORBA、DCOM成熟,还在不断完善之中。

二、基本概念的比较

 COM/DCOM

 COM/DCOM对象模型设计的指导思想是健壮、高效和切实可行。COM对象具有多个接口,通过每个接口可以访问一组成员函数。成员函数相当于方法。每个对象拥有自己的数据,表示对象的状态。数据只能通过接口访问,用户和应用程序不能越过接口访问数据。每个接口仅包含其所属成员变量函数的调用说明及引用它的指针。成员函数的实现不是对象的一部分,一般可以有两种方法实现:一是用动态链接库DLL实现,二是作为一个可执行模块EXE实现。不管哪一种实现,成员函数都可以动态调用,直接执行,不需要编译连接。甚至调用者所用的程序设计语言与实现成员函数所用的程序设计语言也可以是不同的。用DLL实现时,在调用成员函数前必须将DLL加载到本地进程的地址空间,不能跨进程空间进行访问。而EXE模块不受这个限制,可以跨进程访问。

 在COM对象的多个接口中,有一个接口是每个对象必备的该接口被命名为Iunknown,接口名前面加字母I,以便识别。

 COM/DDCOM也有类的概念,类也看成是一种对象,称为类对象。由于COM/DCOM不支持继承的概念,一个对象的所有接口及其成员函数都已在对象中定义,在引用对象时不必到其所属的类或其祖先类中查询有关的内容。只有在创建一个对象(即类的一个实例)时,才用到类中的内容。在COM中,除了类以外,还有类型(type)的概念。类型比类更抽象,它与实现无关。而类中可含有一些与实现有关的属性,诸如支持它的软件名称、所用的图表等。例如一个复合文件可以定义成一个类型,但这种类型可用不动的字处理软件、电子表格软件、多媒体软件来实现,形成不同的类,可用不同的图表表示。用户可以根据运行环境在同一类型中选择合适的类。

CORBA

 CORBA的对象模型基本上按OMG所定义的公共对象模型COM(不同于微软的COM),支持类、封装、继承和多态,是一个功能比较完备的对象模型。对象或类之间可按客户/服务器方式互相调用。每个对象或类即可以作为客户,也可以作为服务器,有时还可以兼作客户和服务器。
客户对象和服务器对象只通过消息交互作用。客户对象向服务器对象发出请求,服务器对象响应客户对象的请求完成一定的操作,并返回操作结果和必要的信息。它们只通过消息往来,不必了解与请求无关的功能。即使客户对象或服务对象重新实现,只要接口的语法和语义不变,不影响用户的使用。

 客户和服务器的通信方式一般有两种:常用的是同步方式,即客户提交请求后,客户要等到服务器放操作执行完毕并返回操作结果或信息后,才继续运行;另一种方式是异步方式,即客户提交请求后,可继续运行。

Java Beans

 与其它分布对象模型一样,Java Beans是以对象作为基本构件。类是对象的模板,而对象(即Bean)是有类生成的一个实例。类中可有多种构造对象的函数。如果生成对象时,不指明具体的构造函数,仅指明类名,则用下面的接口调用:new <Class nama> ()。这就表示用类中的缺省构造函数Constructor()生成对象。在Java Beans中,一组对象相互联系,相互作用,有公共的接口,服务于某一应用目的,则这组对象组成一个容器。以上的概念和方法与CORBA、DCOM相类似。

三、技术内容及特点的比较

 COM/DCOM

 1. 全局唯一标识符
   在COM/DCOM对象模型中,对象的每个接口、每个类对象、每个类型都有一个全局唯一标识符,为了保证标识符的唯一性,COM/DCOM用128位的整数作为全局的唯一标识符。
 
 2. 代码复用和继承
   从健壮性考虑,COM/DCOM对象模型中没有采用继承的概念,但是并不影响代码的复用,它的包含/委托机制就可以体现代码复用的作用。从长远来看,作为一个通用系统对象模型,COM/DCOM增加继承机制是必要的,问题在于克服继承带来的负面影响。

 3. 多接口和对象的演化
   由于COM/DCOM的接口是不可改变的,所以要有变化,只能新增一个接口。COM/DCOM允许多个接口并存,这样也就不用使用版本的概念,而用同一个对象的多个接口来区分。多接口也增强了对象的开放性,任何用户可以在自己选择的对象上定义其需要的新接口。

 4. 持久数据及其操作
   这里的持久数据指存储在磁盘上的数据,在COM/DCOM中,仍借用文件系统中的功能,不过要把文件系统的有关功能映射成对象的接口。在COM/DCOM中有两种持久数据对象:一是存储对象;二是流对象。存储对象和流对象的数据可有两种访问模式:一是直接方式;二是事务方式。

 5. 持久数据智能名
   在访问磁盘上的持久数据时,用户往往只给出数据名,而由文件系统或数据库系统根据数据名去寻找数据,这个过程叫做数据名与数据的绑定。为了在COM/DCOM中实现数据的绑定功能,专门创建了一个类对象,叫Moniker。

 6. COM/DCOM库
   COM/DCOM库与所用的平台有关,对不同的平台,有相应的COM/DCOM库。

CORBA

 1. 结构概况
   CORBA的结构分为客户方、服务方、ORB、对象服务、公共设施、IDL源文件、实现仓库等部分。ORB是连接各方的核心。客户应用程序的请求交给ORB(客户方),ORB可为客户选择合适的服务器和方法代码,在服务方执行。服务方返回用户的操作结果或信息也由ORB转交。

 2. 调用方式
   在CORBA中,客户向服务器提交请求的过程叫调用。为了形成请求,客户程序至少提供两种数据:一是操作名称及其参数;二是对象引用。应用程序设计者须按IDL的格式将操作的接口定义于OMG IDL文件中。为了用这些数据形成请求,CORBA提供了存根型调用和动态调用两种机制。
 3. 服务器方的CORBA软件
   当客户的请求提交给ORB后,ORB按其所选的服务器和方法,通过对象适配器OA引导到相应方法的实现程序。对象适配器OA通过服务器构架调用方法。下面是对这些构件的功能的描述:
  • 对象适配器OA:是ORB与服务器中具体实现通信的连接软件;
  • 服务器构架:当对象适配器OA选择并激活相应的类以后,服务器构架通过服务器构架中的子程序,将请求的操作映射成相应方法的实现并通知服务器,在服务器控制下执行方法。
  • 实现仓库:实现仓库中含有定位和激活对象的信息,是对象访问和具体实现相结合的手段,正像接口仓库是对象访问与具体接口相结合的手段。
 4. 在异构数据集成中的应用
   由于各种数据源有各自的用户接口,若要通过ORB相互访问,必须提供面向对象的接口。为此,对每种数据源,都要加上一个包装器。包装器实质上就是一个用户接口转换器。因为对象模型是很通用的模型,各种数据源都可以用等效的对象接口替代。不过包装器实现起来有简单和复杂之分。例如,OODB的包装器实现起来就比较简单,而WWWDE的包装器实现起来就比较复杂。

 5.CORBA规范的技术特点
  • 引入了代理的概念
  • 所实现的客户方程序与服务器方程序的完全分离
  • 将分布计算同面向对象的概念相互结
  • 提供了软件总线的机制
  • 分层的设计原则与实现方法

Java Beans

 1. 对象级的状态保留
 Java Beans生成的对象若不特别申明,则只存在于内存中。当对象中断运行时,对象的状态可能从内存消失,如果对象再恢复运行,则需重新生成并初始化。为此,Java Beans提供了状态保留功能,只要在生成对象时加上申明implements java.io.serializable或implements java.io.Externalizable。前一种申明表示在对象中断运行时调用运行环境中的工具软件保留对象状态,在对象中并无保留对象状态的方法;后一种申明表示在对象中断运行时有对象本身的方法保留对象状态,主要用于对保留方式有特殊要求的场合,例如有些属性值可以免于保留。

 2. 内省和核心反射
 Java Beans通过Introspector类的Core Reflection API到类中直接读取类及方法的定义,通过Introspector类所获得的类的属性、事件和方法的定义都保存在名为Bean Info的对象中。若要查询一个类的定义,只要访问Bean Info对象即可。

 3. 多线程控制
 Java语言具有多线程控制功能,为了解决临界区访问冲突的问题,在Java Beans中用Synchronized语句定义临界区。当线程执行到临界区时,它必须先取得临界区的锁,才能执行临界区中的代码。如果没有申请到锁,该线程须排队等待,从而实现临界区的互斥功能。

 4. 安全措施
 当运行来源不明的Beans时,很可能使用户的计算机系统遭到有意无意的破坏。为了防止破坏,Java Beans在下面四个环节采取了安全措施:
Java语言及其编译器;字节码检测器;类加载器;安全管理软件。

以上在“相关背景”、“基本概念”、“技术内容及特点”三个方面分别对COM/DCOM、CORBA和Java Beans进行了对比,随着技术的进步,它们还会产生更多的共性和特色,同时也会为我们系统的开发带来更多的便利。

 

版权所有:UML软件工程组织