• 1. 软件互操作接口定义
  • 2. 为了使客户能够准确、方便地访问服务 服务的提供者必须 对自身进行准确的描述 并以一定的方式提供给客户
  • 3. 一、接口是什么 二、OMG-IDL 三、WSDL 四、比较内 容
  • 4. 一、接口是什么1、概念接口(Interface)
  • 5. 应用编程接口(API) 对象接口 构件接口 抽象?实在?模块通常由接口和实现两部分组成 模块的接口部分 刻画了各个模块是如何耦合的 其他模块的设计者和使用者需要知道 模块的实现部分 是各个模块的内部事务 其他模块的设计者和使用者不需要知道包含什么具体内容?(功能性、约束性) 利用什么形式描述?(接口定义语言)含义解释
  • 6. 单机环境下的不同软件模块之间 主要定义模块的功能性(Functional)内容 类似于一个函数的映射过程 接口的功能性定义是对接口中各个操作调用方式的描述 操作 是由操作符标识的实体 指明了一个不可再分的服务原语 请求一个操作的动作被称为调用一个操作 对一个操作功能的描述由输入、输出两部分组成 也被称为一个特征标记(signature) 用于描述操作的输入、输出参数名称及类型功能性(Functional)
  • 7. 网络环境下的不同软件模块的合作需要考虑的因素 不仅仅包含功能方面 还涉及分布性、可靠性、安全性等方面的因素 网络环境下的接口 除需要定义模块的功能性内容外 还需要定义模块的约束性内容 接口的约束性定义是指对功能以外特征的描述 简单的包括:例外处理、执行语义等 复杂一些的包括: (1)行为特征:用于描述操作的输出 通过对操作增加前置与后置条件而实现 (2)同步特征:用于描述分布性与并发性约束性(Constraint)
  • 8. IDL: Interface Definition LanguageWSDL: Web Service Description Language接口定义语言服务描述语言interface Hospital { typedef string PatientId; PatientId admit_patient ( ); void release_patient ( in PatientIdpatient ); };
  • 9. PL6PL2PL5PL1PL4PL3PL6PL2PL5PL1PL4PL3IDL2、为什么需要IDL?
  • 10. IDL SmalltalkCobolJavaAda-95C++C
  • 11. 1、IDL概述 2、IDL词法 3、IDL语法 4、IDL规范二、OMG-IDL
  • 12. 1、IDL概述 IDL: Interface Definition Language 接口定义语言 用OMG IDL编写的接口定义 较完整地定义了接口 并且 指定了每个操作的参数 OMG IDL接口提供的信息 被用于 开发使用接口操作的客户 客户程序不用纯描述性语言OMG IDL编写 而是用事先定义的映射 从OMG IDL概念映射到的语言编写
  • 13. CORBA规范中最有意义的内容之一 IDL文件类似于应用程序接口(API)文档 在客户代码与对象实现(服务)之间定义了 一个清晰的边界 OMG IDL是一个稳定的标准 自1991年公布以来基本未改变 是OMG其它被采纳规范的基础 已经被ISO采纳(ISO DIS 14750)
  • 14. 一个IDL文件可以向多个编程语言映射 IDL是独立于语言的 CORBA规范包含IDL向具体编程语言的映射 已经发布映射规范的语言包括: C, C++, SmallTalk, Ada95 等
  • 15. IDL支持平台独立性 IDL是独立于平台的 由IDL指定的接口可以在不同的ORB 不同的运行平台上 一致地表达 只要程序员使用由IDL定义的接口 不会遇到由于使用CORBA导致的 平台移植问题
  • 16. IDL是一个纯规范,不涉及实现问题 IDL定义的接口不对对象实现进行任何约束 例如: 编程语言 进程 算法 等 将客户从对象实现细节中清晰地分离出来 有利于: 软件复用 软件演化 这是IDL被广泛接收的重要原因
  • 17. 接口的设计质量至为重要 接口通常被用于定义应用系统中的重要接口 例如: 子系统接口 企业模型接口 库接口 等 这些接口是复用、互操作的关键部分 接口的变化将影响系统中的多个软件模块 好的接口将: 提高复用与互操作性 提高系统的适应性 降低维护费用
  • 18. OMG IDL词法 遵循C++的词法规则2、IDL词法KeyWords:
  • 19. OMG IDL语法 是已被提议的ANSI C++标准的子集 但比C++更严格: 函数返回类型是强制的 对操作声明的每个正式参数都必须提供名称 由单个符号void组成的参数列表 不允许作为 空参数列表的同义字 结构、discriminated联合和枚举要求被标记 整数类型不能定义为简单的 int 或 unsigned 它们必须显式声明为short或long char不能由 signed 或 unsigned 关键字限定3、IDL语法
  • 20. 4、IDL规范IDL文档(模块)常量类型异常接口值类型模块常量类型异常操作属性例子
  • 21. (1) IDL 常量 (Constants) 例如: const octet O1 = 0x1; const long L = 3; const octet O2 = 5 + L; enum Color { red, green, blue }; const Color FAVORITE_COLOR = red; module M { enum Size { small, medium, large }; }; const M::Size MYSIZE = M::medium; const Color col = red; // is OK const Color another = M::medium; // is an error
  • 22. IDL中类型定义的目的在于 支持操作特征标记的强类型检查 ——确保系统接受的表达式求值时不发生错误 类型声明包括: IDL中特殊类型的重命名 创建用户定义的类型 例如: 枚举 结构 数组 序列 联合 等 (2) IDL 类型(Type)
  • 23. 例子: 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;
  • 24. 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}; union Person switch (PersonKind) { case A_GUEST: GuestRecord guest_record; case AN_EMPLOYEE EmployeeRecord employee_record; default: string description; };
  • 25. 与其它计算模型相比,CORBA作出了一个重要的保证 发出调用的客户总是可以接收到 一个成功的返回 或者一个例外 这是对分布计算复杂性的重要简化 并可以明显地降低客户方的代码量 例外值的声明类似于IDL结构类型 例如: exception CardExpired { string expiration_date; }; exception CreditLimitExceeded { unsigned long credit_limit; }; exception CardReportedStolen { string reporting_instructions; unsigned long hotline_phone_number; };(3) IDL 例外 (Exceptions)
  • 26. 例外被分为两类: 用户定义的 与 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 };
  • 27. IDL接口定义分布对象显露的细节 每个IDL接口定义了一个新对象类型 操作特征标记(Signature) 是接口的核心 是服务请求的入口点 接口 清晰地划分了服务的实现与客户之间的边界 接口的不足之处:未显示代码之间的关系(4) IDL 接口 (Interface)
  • 28. 例子: 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 支持多继承
  • 29. 操作特征标记(Signature)的一般形式为: [oneway](param1,...,paramL) [raises(except1,...,exceptN)][context(name1,...,nameM)] 其中: · 可选的oneway关键字指示对该操作的请求预期获得最佳效果 语义;如果操作成功返回结果,则默认语义是只有一次,如 果返回例外处理,则默认语义是最多一次 · 是返回结果的类型 · 为接口中的操作提供名称 · 操作所需的操作参数;它们以修饰符in、out或inout标记, 目的是指示信息流的方向(相对于执行请求的对象) · 可选的raises表达式指示可以引发的用户定义例外处理,它们 用于终止对该操作的请求;如果没有提供这样的表达式,那么 不会引发任何用户定义的例外处理 · 可选的context表达式指示将对对象实现有效的请求环境信息; 没有其它信息需要与请求一起传送(5) IDL 操作
  • 30. 操作特征标记规范是IDL的基本目标 当IDL向特定语言编译时 每个特征标记对应于一个目标对象 目标对象的类型是接口的声明名字 例如: interface Hospital { typedef string PatientId; PatientId admit_patient ( ); void release_patient ( in PatientIdpatient ); }; 确省情况下, IDL操作是同步的 当 有 oneway 关键字时,IDL操作是异步的
  • 31. (6)IDL属性 IDL 定义显露公共的属性与操作 如果属性或者操作是私有的 则它不应出现在IDL定义中 属性可以是 只读的(Read-only) 或者 可读写的(read-write) 每个属性都具有一个IDL数据类型 并出现在一个特定的IDL接口定义中
  • 32. 例如: interface foo { enum material_t {rubber, glass}; struct position_t { float x, y; }; attribute float radius; attribute material_t material; readonly attribute position_t position; • • • };
  • 33. IDL序列 (Sequence) 序列是IDL特有的特殊数据类型 其本质上是变长数组 下面的例子通过IDL向C语言的映射 显示了序列的实现方式 typedef sequence LongSeq; struct Automobile { string make, model; unsigned short year;}; typedef sequence AutomobileSeq;
  • 34. 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;
  • 35. (7) 值类型(Value Type) 一般情况下 在IDL定义的接口中 如果一个返回参数是一般的类型 则它将总是返回参数的值 如果一个返回参数是一个对象的接口 则它通常返回参数(即服务对象)的引用 如果此时希望返回服务对象的值 则需要将该参数声明为值类型 值类型是CORBA为解决在操作过程中传递对象的值而引入的类型 值类型介于接口类型与结构类型之间 值类型的实现总是本地的
  • 36. 为IDL定义 创建 分离的名空间 防止不同领域中标识之间的冲突 模块可以嵌套 以创建 具有一定长度的 限定范围的 名字引用 名字引用例子: Part::Assembly::ComponentWidget (8)IDL 模块 (Modules)
  • 37. 3个模块例子: module Assembly { typedef string Widget; }; module Part { typedef Assembly::Widget PartWidget; module ComponentPart { typedef PartWidget ComponentWidget; }; }; CORBAServices 对模块进行扩充使用 每个服务定义了一个或多个模块
  • 38. module CosNaming{ typedef string Istring; struct NameComponent { Istring id; Istring kind; }; typedef sequence Name; enum BindingType {nobject, ncontext}; struct Binding { Name binding_name; BindingType binding_type; }; typedef sequence BindingList; interface BindingIterator; interface NamingContext { … } … }例如:NamingService的定义为:
  • 39. 一个完整的例子: 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, ) raises (BadFrequentflyerNumber, SeatNotAvailable) context ( “TicketAgent”, “Agency”); };
  • 40. 三、WSDL1、文档结构 2、例子 3、向SOAP的映射
  • 41. 类型消息端口类型绑定服务操作操作端口抽象定义具体说明WSDL文档代表依赖关系代表包含关系1、文档结构
  • 42. 类型:独立于计算机和语言的类型定义 使用某一类型系统(例如XSD)进行数据类型定义的容器 用于描述被交换的消息 消息:对通信数据的一个抽象、类型化定义 一个消息包含多个逻辑部分 每一个都与某一个类型系统中的定义相关联 包含函数参数(输入与输出分开)或文档说明 端口类型:由一个或多个端点支持操作的抽象集合 每个操作对应于一个输入消息与一个输出消息 它引用消息节中的消息定义来说明函数特征标记 操作名称、输入参数和输出参数 等(1)抽象定义
  • 43. 绑定:为一个由特定端口类型定义的操作与消息 指定具体的协议及数据格式规范 服务:指定每个绑定的端口地址(2)具体说明
  • 44.    2、例子
  • 45.  
  • 46. interface FooSample { long foo(long arg); } 用OMG-IDL表示为:
  • 47. 对应的SOAP请求消息为: 5131953 3、向SOAP的映射
  • 48. 5131953
  • 49. 四、比较有的以描述结构化程序的功能为主 例如 RPC-IDL 微软的-IDL 有的以描述对象的功能为主 例如 CORBA的IDL 有的以描述服务为主 例如 web service的WSDL1、描述对象不同
  • 50. 有的以具体计算机语言的方式表达 例如SUN的Java Interface 有的以独立于具体的计算机语言 但十分类似于计算机语言的方式表达 例如:RPC-IDL 微软的-IDL CORBA的IDL 有的以XML为方式表达 例如:web 服务的WSDL2、描述方式不同
  • 51. 有的仅描述接口的语法信息 例如:RPC-IDL 微软的-IDL CORBA的IDL 有的还包括与底层协议的绑定信息 例如:WSDL等 在CORBA中这部分信息包含在IOR中3、描述内容不同
  • 52. 思 考 题1、接口等价于操作吗? 2、IDL在互操作中处于一种什么样的地位? 3、IDL与具体编程语言的关系是怎样的? 4、什么是WSDL?