为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

高级软件工程03(IDL与ORB接口)

2010-10-21 46页 ppt 96KB 10阅读

用户头像

is_082674

暂无简介

举报
高级软件工程03(IDL与ORB接口)nullnull4、OMG IDLOMG IDLIDL特点 IDL规范 模块 接口 提前声明 常量 类型声明 序列 any 类型 属性 例外 操作签名 预编译null1、IDL特点 CORBA规范中最有意义的内容 IDL类似于应用程序接口(API) 在客户代码与对象实现(服务)之间定义了 一个清晰的边界 OMG...
高级软件工程03(IDL与ORB接口)
nullnull4、OMG IDLOMG IDLIDL特点 IDL规范 模块 接口 提前声明 常量 类型声明 序列 any 类型 属性 例外 操作签名 预编译null1、IDL特点 CORBA规范中最有意义的内容 IDL类似于应用程序接口(API) 在客户代码与对象实现(服务)之间定义了 一个清晰的边界 OMG IDL是一个稳定的 自1991年公布以来,基本未改变 是OMG其它被采纳规范的基础 已经被ISO采纳(ISO DIS 14750) OMG IDLnull 一个IDL文件可以向多个编程语言映射 IDL是独立于语言的 CORBA规范包含IDL向具体编程语言的映射 已经发布映射规范的语言包括: C, C++, SmallTalk, Ada95 等 IDL支持平台独立性 IDL是独立于平台的 由IDL指定的接口可以在不同的ORB 与平台上一致地表达 只要程序员使用由IDL定义的接口 不会遇到由于使用CORBA导致的 平台移植问题OMG IDLnull IDL是一个纯规范,不涉及实现问题: IDL定义的接口不对对象实现进行任何约束 例如: 编程语言 进程 算法 等 将客户从对象实现细节中清晰地分离出来 有利于: 软件复用 软件演化 这是IDL被广泛接收的重要原因OMG IDLnull IDL设计的质量至为重要 IDL通常被用于定义应用系统中的重要接口 例如: 子系统接口 企业模型接口 库接口 等 这些接口是复用、互操作的关键部分 IDL的变化将影响系统中的多个软件模块 好的IDL将: 提高复用与互操作性 提高系统的适应性 降低维护费用 OMG IDLnull2、IDL规范 IDL是一个严格的定义 用OMG IDL编写的接口定义 完整地定义了接口 并且 完全指定了每个操作的参数 OMG IDL接口提供的信息 被用于开发使用接口操作的客户 客户程序不用纯描述性语言OMG IDL编写 而是用事先定义的映射 从OMG IDL概念映射到的语言编写的OMG IDLnullOMG IDL词法 遵循C++的词法规则 OMG IDL语法 是已被提议的ANSI C++标准的子集 但比C++更严格: 函数返回类型是强制的 对操作声明的每个正式参数都必须提供名称 由单个符号void组成的参数列表 不允许作为 空参数列表的同义字 结构、discriminated联合和枚举要求被标记 整数类型不能定义为简单的 int 或 unsigned 它们必须显式声明为short或long char不能由 signed 或 unsigned 关键字限定OMG IDLnull(1)IDL 模块 (Modules) 为IDL定义 创建 分离的名空间 防止不同领域中标识之间的冲突 模块可以嵌套 以创建 具有一定长度的 限定范围的 名字引用 名字引用例子: Part::Assembly::ComponentWidget OMG IDLnull3个模块例子: module Assembly { typedef string Widget; }; module Part { typedef::Assembly::Widget PartWidget; module ComponentPart { typedef PartWidget ComponentWidget; }; }; CORBAServices 对模块进行扩充使用 每个服务定义了一个或多个模块OMG IDLnull(2) IDL 接口 (Interface) IDL接口定义分布对象显露的细节 每个IDL接口定义了一个新对象类型 操作签名 是接口的核心 是服务请求的入口点 接口 清晰地划分了服务的实现与客户之间的边界 接口的不足之处:未显示代码之间的关系OMG IDLnull例子: Interface Account { //Account definitions } Interface Cheking: Account { //Inherits all Account definitions //adds Checking definitions }; Interface Saving: Account { //Inherits all Account definitions //adds Savings definitions }; IDL 支持多继承OMG IDLnull(3) IDL Forward 用于声明 一个未定义的接口 例子: interface Employee; //forward declaration struct EmployeeContacts { Employee supervisor; Employee secretary; Employee union_shop_leader; } interface Employee { attribute EmployeeContacts contacts; typedef string JobTitle; // other definitions } OMG IDLnull (5) IDL 类型声明(4) IDL 常量 (Constants) IDL中类型定义的目的在于 支持操作签名的强类型检查 类型声明包括: IDL中特殊类型的重命名 创建用户定义的类型 例如: 枚举 结构 数组 序列 联合 等 OMG IDLnull例子: 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 GuestList;OMG IDLnulltypedef 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; };OMG IDLnull(6) IDL序列 (Sequence)序列是IDL特有的特殊数据类型 其本质上是变长数组 下面的例子通过IDL向C语言的映射 显示了序列的实现方式 IDL: typedef sequence LongSeq; struct Automobile { string make, model; unsigned short year;}; typedef sequence AutomobileSeq;OMG IDLnullC: 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;OMG IDLnull(7) 动态IDL Type AnyIDL 提供了强类型接口定义的能力 同时也存在弱类型数据值的能力 方式:CORBA type any。 例如: typedef any DynamicallyTypedValue; struct RunTimeValue { string description; any run_time_value; }; exception userError { string explanation; any exception_value; };OMG IDLnull类型Any的值是自标识的 包含关于运行时类型的信息 IDL编译器为用户定义的类型 产生 type code 值 CORBA 接口池的接口包括 运行时产生新类型代码的机制 type any 在定义可复用接口方面有用 例如,type any 在 CORBAServices 中被大量使用 因为这些服务被期望在任意应用程序中复用OMG IDLnull(8)IDL属性IDL 定义显露公共的属性与操作 如果属性或者操作是私有的 则它不应出现在IDL定义中 属性可以是 只读的(Read-only) 或者 可读写的(read-write) 每个属性都具有一个IDL数据类型 并出现在一个特定的IDL接口定义中 OMG IDLnull(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; };OMG IDLnull例外被分为两类: 用户定义的 与 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 };OMG IDLnull(10) IDL 操作签名操作签名规范是IDL的基本目标 当IDL向特定语言编译时 每个签名对应于一个目标对象 目标对象的类型是接口的声明名字 例如: interface Hospital { typedef string PatientId; PatientId admit_patient ( ); void release_patient ( in PatientIdpatient ); }; 确省情况下, IDL操作是同步的 当 有 oneway 关键字时,IDL操作是异步的OMG IDLnull一个完整的例子: 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”); };OMG IDLnullIDL很重要 是CORBA规范的关键 是分离客户与实现的关键 是具体代码实现的起点 IDL 从何而来? 手工编写 OOD导出 OMG IDLnull5、ORB接口ORB操作综述 对象引用操作 ORB初始化 获取初始对象应用 策略对象 线程相关的操作ORB接口null(1)ORB操作综述 由ORB核心实现 不依赖于所使用的对象适配器ORB接口null对于所有的ORB和所有的对象实现而言 这些操作都是一样的 它们既可以由客户端的对象执行 也可以由实现方的对象执行 一些这样的操作在ORB上出现 另一些在对象引用上出现 尽管在描述方式上这些操作 看起来就象对象上的操作一样 但是, 因为该部分所讨论的操作都由ORB自身实现 所以实际上不是对象上的操作ORB接口null 因为 对象引用是不透明的 而且各ORB之间不一样 所以 对于对象引用的长期存储 或 对象引用的通信(除激活之外)来说 对象引用不是一个很方便的值 因而必须解决两个问题: 允许对象引用转换成 一个客户可以存储在其他介质上的值 并确保该值以后能够转换为正确的对象引用(2)对象引用与字符串的转换ORB接口nullORB接口可以通过object_to_string操作 把一个对象引用转化为一个字符串 该字符串值就可以以任何字符串所能被处理的方式 进行存储或通信 string_to_object操作 接受由object_to_string产生的字符串 并返回相应的对象引用null(3) 对象引用操作 有一些操作可以在所有对象上进行 它们并不是通常意义上的操作 因为 这些操作直接由ORB实现 而并不传递到对象实现端 我们将以在对象引用上的操作的方式 来讨论这些操作 尽管它们的接口实际上依赖于语言绑定ORB接口null interface Object { // PIDL 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);这样的操作包括:ORB接口nullvoid 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 ); };ORB接口nullInterfaceDef get_interface (); ImplementationDef get_implementation (); 确定对象实现和接口 对象引用上的get_interface操作返回 Interface Repository里的一个对象 该对象提供可能对程序有用的类型信息 Object上的get_implementation操作 返回实现池里的一个对象 该对象描述对象的实现 ORB接口nullObject duplicate (); void release (); 复制和释放对象引用的拷贝如果需要多于一个的对象引用 则客户可以用duplicate操作创建一个副本 注意:对象实现不能创建副本 而且实现方也不能区别在一个特定的请求中 客户使用的是原来的对象引用还是副本 当程序不再需要一个对象引用时 则可以用release操作收回它所占用的存储空间 注意:对象实现不能进行这样的操作 对象自身和任何其他对它的引用 都不会受到release操作的影响ORB接口nullboolean is_a (in string logical_type_id) 等价性检查操作 定义该操作的目的是在一个ORB范围上 帮助维护对象引用的类型安全性 如果该对象确实是该类型的一个实例 或者如果该类型是该对象的“最底层”的类型的祖先 则该操作返回trueboolean is_nil (); 测试一个对象引用是否为空 一个值为OBJECT_NIL的对象引用表示没有对象ORB接口nullboolean non_existent (); 用来检测一个对象(如一个代理对象)是否已被破坏 那些维护着包括对象引用的状态的服务, 如桥、事件通道和基本关系服务等 可以利用它们的“空闲时间” 使用该操作从对象表中筛选出那些不再存在的对象 并以垃圾收集的形式删除它们ORB接口nullunsigned long hash (in unsigned long maximum); boolean is_equivalent (in Object other_object); 对象引用同一性 为了有效地管理包含大量对象引用的状态 部分服务需要支持一个对象引用同一性的概念 这样的服务包括: 桥 关系服务 其他分层的服务 等 CORBA提供了两个有关同一性的操作 一个操作是把对象引用映射到不相邻的组里 这样的组里的对象引用具有潜在的等价性; 另一个操作是支持开销更大的成对地定价性检查 这些操作一起支持对以对象引用为关键字的表的 高效地维护和检索ORB接口nullPolicy get_policy (in PolicyType policy_type); 获取与对象相关的策略Object set_policy_overrides(in PolicyList policies, in SetOverrideType set_add ); 设置策略DomainManagersList get_domain_managers (); 获取域管理者 ORB接口null(4)ORB初始化 当应用程序要求CORBA环境时 它需要一种获得ORB和OA伪对象引用的机制 这样的机制有两个作用: 把应用程序初始化到ORB和OA环境 向应用程序返回ORB和OA伪对象引用 以便将来使用ORB和OA操作ORB接口null在ORB中初始化应用程序 并获得ORB的伪对象引用的操作 不是在一个对象上进行的 因为应用程序开始时并没有一个能激活操作的对象 ORB初始化操作是应用程序进入CORBA世界的引导程序 应用程序可以初始化到一个或多个ORB中去 当完成一个ORB初始化之后, 返回该ORB的伪对象引用 然后可以用该伪对象引用 获得该ORB的其他对象引用(例如OA)ORB接口null(5)获取初始对象引用应用程序要求一种方便的办法 通过它可以获得它们的初始对象引用 初始引用并不通过一个新的接口获得, 而是增加两个新的操作到ORB伪对象接口中去 这两个操作提供了列出和解析初始对象引用的便利Object resolve_initial_references (in ObjectId identifier) raise (InvalidName) ObjectIdList list_initial_services (); ORB接口null(6)策略域的管理 一个ORB或者CORBA服务可以选择对某些选项进行访问 它们对其操作具有影响 该信息是以结构化的方式 通过从Policy接口继承的接口访问到的 一个 CORBA 服务可以不用这种方法访问上述操作 策略域提供了较直接的方式 特别需要指出的是,安全服务使用这种技术 将安全策略与系统中的对象进行关联ORB接口null相关概念: 策略域 一个策略域是一个对象集合 与该域相关的策略可以应用于这些对象 这些对象是领域成员 策略代表了: 对于该领域内对象活动进行约束的原则与规则 在生成对象引用时 ORB隐式地将对象引用与一个或多个策略域关联 通过在一个领域的粒度 而不是单个对象实例的粒度上应用策略 策略域提供策略管理在规模问题上的平衡ORB接口null策略域管理器 每一个策略域所包含的唯一的一个对象 它与领域中的策略对象相关 域管理器还记录域的成员 并提供 增加 删除 成员的方法 域管理器本身是一个域的成员 可能是它所管理域的成员ORB接口null一个策略对象封装了一个特定类型的策略 通过将策略对象与策略域的域管理器关联 封装在一个策略对象中的策略与域关联 一个域可以有多个策略与之相关 分别通过一个策略对象 一个策略域至多有一个类型的策略与之相关 策略对象被域中的对象所共享 而不是与独立的对象关联 因此 如果一个对象需要有一个独立的策略 它必须是一个域的唯一成员ORB接口策略对象
/
本文档为【高级软件工程03(IDL与ORB接口)】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索