页数:46页文件大小:139.4 KB来源: 高级软件工程ppt课件
本课件包含两部分内容。前半部分讲OMG IDL:先说明IDL作为CORBA规范中最有意义部分的定位、语言与平台独立性以及纯规范性质,再给出词法与语法的严格约定,随后依次讲解模块、接口与多继承、提前声明、常量与类型声明、序列、any类型、属性、例外和操作签名,并配有大量IDL代码示例。后半部分讲ORB接口:从操作综述出发,介绍对象引用与字符串的转换、对象引用上的各类操作与Object接口定义、ORB初始化、获取初始对象引用,以及策略域与策略对象的管理。
4、OMG IDL,涵盖以下主题:IDL特点、IDL规范、模块、接口、提前声明、常量、类型声明、序列、any类型、属性、例外、操作签名、预编译。
1、IDL特点:IDL是CORBA规范中最有意义的内容;IDL类似于应用程序接口(API),在客户代码与对象实现(服务)之间定义了一个清晰的边界。
一个IDL文件可以向多个编程语言映射,IDL是独立于语言的:CORBA规范包含IDL向具体编程语言的映射,已经发布映射规范的语言包括 C、C++、SmallTalk、Ada95 等。
IDL支持平台独立性:由IDL指定的接口可以在不同的ORB与平台上一致地表达。只要程序员使用由IDL定义的接口,就不会遇到由于使用CORBA导致的平台移植问题。
IDL是一个纯规范,不涉及实现问题:IDL定义的接口不对对象实现进行任何约束,例如编程语言、进程、算法等。将客户从对象实现细节中清晰地分离出来,有利于软件复用与软件演化,这是IDL被广泛接收的重要原因。
IDL设计的质量至为重要:IDL通常被用于定义应用系统中的重要接口,例如子系统接口、企业模型接口、库接口等;这些接口是复用、互操作的关键部分,IDL的变化将影响系统中的多个软件模块。
好的IDL将:提高复用与互操作性、提高系统的适应性、降低维护费用。
2、IDL规范:IDL是一个严格的定义。用OMG IDL编写的接口定义完整地定义了接口,并且完全指定了每个操作的参数。
OMG IDL接口提供的信息被用于开发使用接口操作的客户;客户程序不用纯描述性语言OMG IDL编写,而是用事先定义的映射从OMG IDL概念映射到的语言编写。
OMG IDL词法遵循C++的词法规则;OMG IDL语法是已被提议的ANSI C++标准的子集,但比C++更严格:
(1)IDL模块(Modules):为IDL定义创建分离的名空间,防止不同领域中标识之间的冲突;模块可以嵌套,以创建具有一定长度的限定范围的名字。
名字引用例子:Part::Assembly::ComponentWidget
3个模块例子:
module Assembly { typedef string Widget; }; module Part { typedef ::Assembly::Widget PartWidget; module ComponentPart { typedef PartWidget ComponentWidget; }; };CORBAServices 对模块进行扩充使用,每个服务定义了一个或多个模块。
(2)IDL接口(Interface):IDL接口定义分布对象显露的细节,每个IDL接口定义了一个新对象类型;操作签名是接口的核心,是服务请求的入口点;接口清晰地划分了服务的实现与客户之间的边界。
接口的不足之处:未显示代码之间的关系。
Interface Account {} Interface Cheking: Account {} Interface Saving: Account {}IDL支持多继承。
(3)IDL Forward:用于声明一个未定义的接口。
interface Employee;struct EmployeeContacts { Employee supervisor; Employee secretary; Employee union_shop_leader; } interface Employee { attribute EmployeeContacts contacts; typedef string JobTitle;}(4)IDL常量(Constants);(5)IDL类型声明:IDL中类型定义的目的在于支持操作签名的强类型检查。类型声明包括: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;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; };(6)IDL序列(Sequence):序列是IDL特有的特殊数据类型,其本质上是变长数组。下面的例子通过IDL向C语言的映射显示了序列的实现方式。
IDL:
typedef sequence<long> LongSeq; struct Automobile { string make, model; unsigned short year; }; typedef sequence<Automobile> AutomobileSeq;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;(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; };类型 Any 的值是自标识的,包含关于运行时类型的信息;IDL编译器为用户定义的类型产生 type code 值;CORBA接口池的接口包括运行时产生新类型代码的机制。
type any 在定义可复用接口方面有用,例如 type any 在 CORBAServices 中被大量使用,因为这些服务被期望在任意应用程序中复用。
(8)IDL属性:IDL定义显露公共的属性与操作,如果属性或者操作是私有的,则它不应出现在IDL定义中。
(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; };例外被分为两类:用户定义的与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 };(10)IDL操作签名:操作签名规范是IDL的基本目标。当IDL向特定语言编译时,每个签名对应于一个目标对象,目标对象的类型是接口的声明名字。
interface Hospital { typedef string PatientId; PatientId admit_patient ( ); void release_patient ( in PatientId patient ); };确省情况下,IDL操作是同步的;当有 oneway 关键字时,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"); };IDL很重要:是CORBA规范的关键,是分离客户与实现的关键,是具体代码实现的起点。
IDL从何而来?
5、ORB接口,涵盖:ORB操作综述、对象引用操作、ORB初始化、获取初始对象、应用策略对象、线程相关的操作。
(1)ORB操作综述:由ORB核心实现,不依赖于所使用的对象适配器。
对于所有的ORB和所有的对象实现而言,这些操作都是一样的;它们既可以由客户端的对象执行,也可以由实现方的对象执行。一些这样的操作在ORB上出现,另一些在对象引用上出现。
尽管在描述方式上这些操作看起来就象对象上的操作一样,但是因为该部分所讨论的操作都由ORB自身实现,所以实际上不是对象上的操作。
(2)对象引用与字符串的转换:因为对象引用是不透明的,而且各ORB之间不一样,所以对于对象引用的长期存储或对象引用的通信(除激活之外)来说,对象引用不是一个很方便的值。因而必须解决两个问题:允许对象引用转换成一个客户可以存储在其他介质上的值,并确保该值以后能够转换为正确的对象引用。
ORB接口可以通过 object_to_string 操作把一个对象引用转化为一个字符串,该字符串值就可以以任何字符串所能被处理的方式进行存储或通信;string_to_object 操作接受由 object_to_string 产生的字符串并返回相应的对象引用。
(3)对象引用操作:有一些操作可以在所有对象上进行,它们并不是通常意义上的操作,因为这些操作直接由ORB实现而并不传递到对象实现端。我们将以在对象引用上的操作的方式来讨论这些操作,尽管它们的接口实际上依赖于语言绑定。
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);这样的操作包括上述各项。
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); };InterfaceDef get_interface (); ImplementationDef get_implementation ();对象引用上的 get_interface 操作返回 Interface Repository 里的一个对象,该对象提供可能对程序有用的类型信息;Object 上的 get_implementation 操作返回实现池里的一个对象,该对象描述对象的实现。
Object duplicate (); void release ();如果需要多于一个的对象引用,则客户可以用 duplicate 操作创建一个副本。注意:对象实现不能创建副本,而且实现方也不能区别在一个特定的请求中客户使用的是原来的对象引用还是副本。
当程序不再需要一个对象引用时,则可以用 release 操作收回它所占用的存储空间。注意:对象实现不能进行这样的操作;对象自身和任何其他对它的引用都不会受到 release 操作的影响。
boolean is_a (in string logical_type_id) boolean is_nil ()等价性检查操作:定义该操作的目的是在一个ORB范围上帮助维护对象引用的类型安全性。如果该对象确实是该类型的一个实例,或者如果该类型是该对象的“最底层”的类型的祖先,则该操作返回 true。
is_nil 测试一个对象引用是否为空,一个值为 OBJECT_NIL 的对象引用表示没有对象。
boolean non_existent ();用来检测一个对象(如一个代理对象)是否已被破坏。那些维护着包括对象引用的状态的服务,如桥、事件通道和基本关系服务等,可以利用它们的“空闲时间”使用该操作从对象表中筛选出那些不再存在的对象,并以垃圾收集的形式删除它们。
unsigned long hash (in unsigned long maximum); boolean is_equivalent (in Object other_object);为了有效地管理包含大量对象引用的状态,部分服务需要支持一个对象引用同一性的概念,这样的服务包括:桥、关系服务、其他分层的服务等。CORBA提供了两个有关同一性的操作:一个操作是把对象引用映射到不相邻的组里(这样的组里的对象引用具有潜在的等价性);另一个操作是支持开销更大的成对地等价性检查。这些操作一起支持对以对象引用为关键字的表的高效地维护和检索。
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:获取域管理者(4)ORB初始化:当应用程序要求CORBA环境时,它需要一种获得ORB和OA伪对象引用的机制。这样的机制有两个作用:
在ORB中初始化应用程序并获得ORB的伪对象引用的操作不是在一个对象上进行的,因为应用程序开始时并没有一个能激活操作的对象。ORB初始化操作是应用程序进入CORBA世界的引导程序。
应用程序可以初始化到一个或多个ORB中去。当完成一个ORB初始化之后,返回该ORB的伪对象引用,然后可以用该伪对象引用获得该ORB的其他对象引用(例如OA)。
(5)获取初始对象引用:应用程序要求一种方便的办法,通过它可以获得它们的初始对象引用。初始引用并不通过一个新的接口获得,而是增加两个新的操作到ORB伪对象接口中去,这两个操作提供了列出和解析初始对象引用的便利。
Object resolve_initial_references (in ObjectId identifier) raise (InvalidName) ObjectIdList list_initial_services ();(6)策略域的管理:一个ORB或者CORBA服务可以选择对某些选项进行访问,它们对其操作具有影响,该信息是以结构化的方式通过从 Policy 接口继承的接口访问到的。一个CORBA服务可以不用这种方法访问上述操作,策略域提供了较直接的方式。特别需要指出的是,安全服务使用这种技术将安全策略与系统中的对象进行关联。
相关概念:策略域——一个策略域是一个对象集合,与该域相关的策略可以应用于这些对象,这些对象是领域成员。策略代表了:对于该领域内对象活动进行约束的原则与规则。
在生成对象引用时,ORB隐式地将对象引用与一个或多个策略域关联。通过在一个领域的粒度而不是单个对象实例的粒度上应用策略,策略域提供策略管理在规模问题上的平衡。
策略域管理器:每一个策略域所包含的唯一的一个对象,它与领域中的策略对象相关;域管理器还记录域的成员并提供增加、删除成员的方法。域管理器本身是一个域的成员,可能是它所管理域的成员。
策略对象:一个策略对象封装了一个特定类型的策略。通过将策略对象与策略域的域管理器关联,封装在一个策略对象中的策略与域关联。
下载地址:{{downurl}}
{{{a}}}
{{#b}}{{{b}}}
{{/b}} {{/title}} {{#nolog}}登陆注册
{{/nolog}} {{#djsx}}点我刷新
{{/djsx}} {{#gocz}} {{/gocz}} {{#ffqr}} {{/ffqr}}