首页计算机计算机软件高级软件工程 03 IDL与ORB接口.pptx

03 IDL与ORB接口.pptx

页数:46页文件大小:139.4 KB来源: 高级软件工程ppt课件

本课件包含两部分内容。前半部分讲OMG IDL:先说明IDL作为CORBA规范中最有意义部分的定位、语言与平台独立性以及纯规范性质,再给出词法与语法的严格约定,随后依次讲解模块、接口与多继承、提前声明、常量与类型声明、序列、any类型、属性、例外和操作签名,并配有大量IDL代码示例。后半部分讲ORB接口:从操作综述出发,介绍对象引用与字符串的转换、对象引用上的各类操作与Object接口定义、ORB初始化、获取初始对象引用,以及策略域与策略对象的管理。

OMG IDL章节导览页,罗列IDL特点、规范、模块、接口、常量、类型声明、序列、any、属性、例外与操作签名
IDL特点页,强调其是CORBA规范中最有意义的内容并在客户代码与对象实现之间划定清晰边界
独立性说明页,说明一个IDL文件可映射多种编程语言且接口可在不同ORB与平台上一致表达
查看本课件的文字版(共 46 页,供检索与复制)

第1页:OMG IDL 内容导览

4、OMG IDL,涵盖以下主题:IDL特点、IDL规范、模块、接口、提前声明、常量、类型声明、序列、any类型、属性、例外、操作签名、预编译。

第2页:IDL 特点(一)

1、IDL特点:IDL是CORBA规范中最有意义的内容;IDL类似于应用程序接口(API),在客户代码与对象实现(服务)之间定义了一个清晰的边界。

  • OMG IDL是一个稳定的标准:自1991年公布以来,基本未改变
  • 是OMG其它被采纳规范的基础
  • 已经被ISO采纳(ISO DIS 14750)

第3页:IDL 的语言与平台独立性

一个IDL文件可以向多个编程语言映射,IDL是独立于语言的:CORBA规范包含IDL向具体编程语言的映射,已经发布映射规范的语言包括 C、C++、SmallTalk、Ada95 等。

IDL支持平台独立性:由IDL指定的接口可以在不同的ORB与平台上一致地表达。只要程序员使用由IDL定义的接口,就不会遇到由于使用CORBA导致的平台移植问题。

第4页:IDL 是纯规范

IDL是一个纯规范,不涉及实现问题:IDL定义的接口不对对象实现进行任何约束,例如编程语言、进程、算法等。将客户从对象实现细节中清晰地分离出来,有利于软件复用与软件演化,这是IDL被广泛接收的重要原因。

第5页:IDL 设计的质量

IDL设计的质量至为重要:IDL通常被用于定义应用系统中的重要接口,例如子系统接口、企业模型接口、库接口等;这些接口是复用、互操作的关键部分,IDL的变化将影响系统中的多个软件模块。

好的IDL将:提高复用与互操作性、提高系统的适应性、降低维护费用。

第6页:IDL 规范

2、IDL规范:IDL是一个严格的定义。用OMG IDL编写的接口定义完整地定义了接口,并且完全指定了每个操作的参数。

OMG IDL接口提供的信息被用于开发使用接口操作的客户;客户程序不用纯描述性语言OMG IDL编写,而是用事先定义的映射从OMG IDL概念映射到的语言编写。

第7页:IDL 词法与语法规则

OMG IDL词法遵循C++的词法规则;OMG IDL语法是已被提议的ANSI C++标准的子集,但比C++更严格:

  • 函数返回类型是强制的
  • 对操作声明的每个正式参数都必须提供名称
  • 由单个符号 void 组成的参数列表不允许作为空参数列表的同义字
  • 结构、discriminated 联合和枚举要求被标记
  • 整数类型不能定义为简单的 int 或 unsigned,它们必须显式声明为 short 或 long
  • char 不能由 signed 或 unsigned 关键字限定

第8页:IDL 模块(Modules)

(1)IDL模块(Modules):为IDL定义创建分离的名空间,防止不同领域中标识之间的冲突;模块可以嵌套,以创建具有一定长度的限定范围的名字。

名字引用例子:Part::Assembly::ComponentWidget

第9页:IDL 模块定义示例

3个模块例子:

module Assembly { typedef string Widget; }; module Part { typedef ::Assembly::Widget PartWidget; module ComponentPart { typedef PartWidget ComponentWidget; }; };

CORBAServices 对模块进行扩充使用,每个服务定义了一个或多个模块。

第10页:IDL 接口(Interface)

(2)IDL接口(Interface):IDL接口定义分布对象显露的细节,每个IDL接口定义了一个新对象类型;操作签名是接口的核心,是服务请求的入口点;接口清晰地划分了服务的实现与客户之间的边界。

接口的不足之处:未显示代码之间的关系。

第11页:IDL 接口继承示例

Interface Account {} Interface Cheking: Account {} Interface Saving: Account {}

IDL支持多继承。

第12页:IDL 提前声明(Forward)

(3)IDL Forward:用于声明一个未定义的接口。

interface Employee;struct EmployeeContacts { Employee supervisor; Employee secretary; Employee union_shop_leader; } interface Employee { attribute EmployeeContacts contacts; typedef string JobTitle;}

第13页:IDL 常量与类型声明

(4)IDL常量(Constants);(5)IDL类型声明:IDL中类型定义的目的在于支持操作签名的强类型检查。类型声明包括:IDL中特殊类型的重命名,创建用户定义的类型,例如枚举、结构、数组、序列、联合等。

第14页:IDL 类型声明示例

typedef unsigned long PhoneNumber; typedef string GuestName, Address; enum ChargeCard { MasterCard, Visa, AmericanExpress }; struct GuestRecord { GuestName name; Address address; PhoneNumber number; ChargeCard card_kind; unsigned long card_number, expiration; }; typedef sequence<GuestRecord> GuestList;

第15页:IDL 结构与联合示例

typedef struct Employeestruct { string name; Address address; unsigned long social_security_number; } EmployeeRecord; typedef EmployeeRecord Employee[100]; enum PersonKind { A_GUEST, AN_EMPLOYEE, AN_OTHER }; cunion Person switch (PersonKind) { case A_GUEST: GuestRecord guest_record; case AN_EMPLOYEE: EmployeeRecord employee_record; default: string description; };

第16页:IDL 序列(Sequence)

(6)IDL序列(Sequence):序列是IDL特有的特殊数据类型,其本质上是变长数组。下面的例子通过IDL向C语言的映射显示了序列的实现方式。

IDL:

typedef sequence<long> LongSeq; struct Automobile { string make, model; unsigned short year; }; typedef sequence<Automobile> AutomobileSeq;

第17页:序列的 C 语言映射

C:

typedef struct { CORBA_unsigned_long _maximum; CORBA_unsigned_long _length; CORBA_long *_buffer; } LongSeq; typedef struct { CORBA_char *make, *model; CORBA_unsigned_short year; } Autumobile; typedef struct { unsigned long _maximum; unsigned long _length; Automobile *_buffer; } AutomobileSeq;

第18页:IDL 的 Any 类型

(7)动态IDL Type Any:IDL提供了强类型接口定义的能力,同时也存在弱类型数据值的能力,方式即 CORBA type any。

typedef any DynamicallyTypedValue; struct RunTimeValue { string description; any run_time_value; }; exception userError { string explanation; any exception_value; };

第19页:Any 类型的自标识与用途

类型 Any 的值是自标识的,包含关于运行时类型的信息;IDL编译器为用户定义的类型产生 type code 值;CORBA接口池的接口包括运行时产生新类型代码的机制。

type any 在定义可复用接口方面有用,例如 type any 在 CORBAServices 中被大量使用,因为这些服务被期望在任意应用程序中复用。

第20页:IDL 属性(Attribute)

(8)IDL属性:IDL定义显露公共的属性与操作,如果属性或者操作是私有的,则它不应出现在IDL定义中。

  • 属性可以是只读的(Read-only)或者可读写的(read-write)
  • 每个属性都具有一个IDL数据类型,并出现在一个特定的IDL接口定义中

第21页:IDL 例外(Exceptions)

(9)IDL例外(Exceptions):与其它计算模型相比,CORBA作出了一个重要的保证——发出调用的客户总是可以接收到一个成功的返回或者一个例外,这是对分布计算复杂性的重要简化,并可以明显地降低客户方的代码量。

例外值的声明类似于IDL结构类型:

exception CardExpired { string expiration_date; }; exception CreditLimitExceeded { unsigned long credit_limit; }; exception CardReportedStolen { string reporting_instructions; unsigned long hotline_phone_number; };

第22页:例外的分类与标准例外

例外被分为两类:用户定义的与CORBA定义的标准例外。与标准例外相关的IDL:

#define ex_body { unsigned long minor; completion_status completed; }; enum completion_status { COMPLETED_YES, COMPLETED_NO, COMPLETED_MAYBE }; enum exception_type { NO_EXCEPTION, USER_EXCEPTION, SYSTEM_EXCEPTION };

第23页:IDL 操作签名

(10)IDL操作签名:操作签名规范是IDL的基本目标。当IDL向特定语言编译时,每个签名对应于一个目标对象,目标对象的类型是接口的声明名字。

interface Hospital { typedef string PatientId; PatientId admit_patient ( ); void release_patient ( in PatientId patient ); };

确省情况下,IDL操作是同步的;当有 oneway 关键字时,IDL操作是异步的。

第24页:IDL 完整示例:机票预订

一个完整的例子:

interface AirlineReservation { typedef unsigned long ConfirmationNumber; enum SeatKind { Window, Aisle, Middle }; exception BadFrequentFlyerNumber {}; exception SeatNotAvailable {}; ConfirmationNumber make_reservation { in string passenger_name, in unsigned long frequent_flyer_number, inout SeatKind seat_kind, out string seat_assignment } raises (BadFrequentFlyerNumber, SeatNotAvailable) context ("TicketAgent", "Agency"); };

第25页:IDL 小结与来源

IDL很重要:是CORBA规范的关键,是分离客户与实现的关键,是具体代码实现的起点。

IDL从何而来?

  • 手工编写
  • OOD导出

第26页:ORB 接口内容导览

5、ORB接口,涵盖:ORB操作综述、对象引用操作、ORB初始化、获取初始对象、应用策略对象、线程相关的操作。

第27页:ORB 操作综述

(1)ORB操作综述:由ORB核心实现,不依赖于所使用的对象适配器。

第28页:ORB 操作的适用范围

对于所有的ORB和所有的对象实现而言,这些操作都是一样的;它们既可以由客户端的对象执行,也可以由实现方的对象执行。一些这样的操作在ORB上出现,另一些在对象引用上出现。

尽管在描述方式上这些操作看起来就象对象上的操作一样,但是因为该部分所讨论的操作都由ORB自身实现,所以实际上不是对象上的操作。

第29页:对象引用与字符串的转换

(2)对象引用与字符串的转换:因为对象引用是不透明的,而且各ORB之间不一样,所以对于对象引用的长期存储或对象引用的通信(除激活之外)来说,对象引用不是一个很方便的值。因而必须解决两个问题:允许对象引用转换成一个客户可以存储在其他介质上的值,并确保该值以后能够转换为正确的对象引用。

第30页:对象引用与字符串互转

ORB接口可以通过 object_to_string 操作把一个对象引用转化为一个字符串,该字符串值就可以以任何字符串所能被处理的方式进行存储或通信;string_to_object 操作接受由 object_to_string 产生的字符串并返回相应的对象引用。

第31页:对象引用操作

(3)对象引用操作:有一些操作可以在所有对象上进行,它们并不是通常意义上的操作,因为这些操作直接由ORB实现而并不传递到对象实现端。我们将以在对象引用上的操作的方式来讨论这些操作,尽管它们的接口实际上依赖于语言绑定。

第32页:Object 接口定义(一)

interface Object { InterfaceDef get_interface (); boolean is_nil(); Object duplicate (); void release (); boolean is_a (in string logical_type_id); boolean non_existent(); boolean is_equivalent (in Object other_object); unsigned long hash(in unsigned long maximum);

这样的操作包括上述各项。

第33页:Object 接口定义(二)

 void create_request (in Context ctx, in Identifier operation, in NVList arg_list, inout NamedValue result, out Request request, in Flags req_flag); Policy get_policy (in PolicyType policy_type); DomainManagersList get_domain_managers (); Object set_policy_overrides(in PolicyList policies, in SetOverrideType set_add); };

第34页:确定对象实现和接口

InterfaceDef get_interface (); ImplementationDef get_implementation ();

对象引用上的 get_interface 操作返回 Interface Repository 里的一个对象,该对象提供可能对程序有用的类型信息;Object 上的 get_implementation 操作返回实现池里的一个对象,该对象描述对象的实现。

第35页:复制和释放对象引用

Object duplicate (); void release ();

如果需要多于一个的对象引用,则客户可以用 duplicate 操作创建一个副本。注意:对象实现不能创建副本,而且实现方也不能区别在一个特定的请求中客户使用的是原来的对象引用还是副本。

当程序不再需要一个对象引用时,则可以用 release 操作收回它所占用的存储空间。注意:对象实现不能进行这样的操作;对象自身和任何其他对它的引用都不会受到 release 操作的影响。

第36页:类型检查与空引用测试

boolean is_a (in string logical_type_id) boolean is_nil ()

等价性检查操作:定义该操作的目的是在一个ORB范围上帮助维护对象引用的类型安全性。如果该对象确实是该类型的一个实例,或者如果该类型是该对象的“最底层”的类型的祖先,则该操作返回 true。

is_nil 测试一个对象引用是否为空,一个值为 OBJECT_NIL 的对象引用表示没有对象。

第37页:对象存在性检测

boolean non_existent ();

用来检测一个对象(如一个代理对象)是否已被破坏。那些维护着包括对象引用的状态的服务,如桥、事件通道和基本关系服务等,可以利用它们的“空闲时间”使用该操作从对象表中筛选出那些不再存在的对象,并以垃圾收集的形式删除它们。

第38页:对象引用同一性

unsigned long hash (in unsigned long maximum); boolean is_equivalent (in Object other_object);

为了有效地管理包含大量对象引用的状态,部分服务需要支持一个对象引用同一性的概念,这样的服务包括:桥、关系服务、其他分层的服务等。CORBA提供了两个有关同一性的操作:一个操作是把对象引用映射到不相邻的组里(这样的组里的对象引用具有潜在的等价性);另一个操作是支持开销更大的成对地等价性检查。这些操作一起支持对以对象引用为关键字的表的高效地维护和检索。

第39页:策略相关操作

Policy get_policy (in PolicyType policy_type); Object set_policy_overrides(in PolicyList policies, in SetOverrideType set_add); DomainManagersList get_domain_managers ();
  • get_policy:获取与对象相关的策略
  • set_policy_overrides:设置策略
  • get_domain_managers:获取域管理者

第40页:ORB 初始化

(4)ORB初始化:当应用程序要求CORBA环境时,它需要一种获得ORB和OA伪对象引用的机制。这样的机制有两个作用:

  • 把应用程序初始化到ORB和OA环境
  • 向应用程序返回ORB和OA伪对象引用以便将来使用ORB和OA操作

第41页:ORB 初始化的引导作用

在ORB中初始化应用程序并获得ORB的伪对象引用的操作不是在一个对象上进行的,因为应用程序开始时并没有一个能激活操作的对象。ORB初始化操作是应用程序进入CORBA世界的引导程序。

应用程序可以初始化到一个或多个ORB中去。当完成一个ORB初始化之后,返回该ORB的伪对象引用,然后可以用该伪对象引用获得该ORB的其他对象引用(例如OA)。

第42页:获取初始对象引用

(5)获取初始对象引用:应用程序要求一种方便的办法,通过它可以获得它们的初始对象引用。初始引用并不通过一个新的接口获得,而是增加两个新的操作到ORB伪对象接口中去,这两个操作提供了列出和解析初始对象引用的便利。

Object resolve_initial_references (in ObjectId identifier) raise (InvalidName) ObjectIdList list_initial_services ();

第43页:策略域的管理

(6)策略域的管理:一个ORB或者CORBA服务可以选择对某些选项进行访问,它们对其操作具有影响,该信息是以结构化的方式通过从 Policy 接口继承的接口访问到的。一个CORBA服务可以不用这种方法访问上述操作,策略域提供了较直接的方式。特别需要指出的是,安全服务使用这种技术将安全策略与系统中的对象进行关联。

第44页:策略域的概念

相关概念:策略域——一个策略域是一个对象集合,与该域相关的策略可以应用于这些对象,这些对象是领域成员。策略代表了:对于该领域内对象活动进行约束的原则与规则。

在生成对象引用时,ORB隐式地将对象引用与一个或多个策略域关联。通过在一个领域的粒度而不是单个对象实例的粒度上应用策略,策略域提供策略管理在规模问题上的平衡。

第45页:策略域管理器

策略域管理器:每一个策略域所包含的唯一的一个对象,它与领域中的策略对象相关;域管理器还记录域的成员并提供增加、删除成员的方法。域管理器本身是一个域的成员,可能是它所管理域的成员。

第46页:策略对象

策略对象:一个策略对象封装了一个特定类型的策略。通过将策略对象与策略域的域管理器关联,封装在一个策略对象中的策略与域关联。

  • 一个域可以有多个策略与之相关,分别通过一个策略对象
  • 一个策略域至多有一个类型的策略与之相关
  • 策略对象被域中的对象所共享,而不是与独立的对象关联;因此如果一个对象需要有一个独立的策略,它必须是一个域的唯一成员
顶部目录