- 1、本文档共62页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
兼容性 兼容性 本讲介绍 源码级和二进制级的兼容性 它可以被认为一个基本编程规则的集合... 以确保代码能在未来可用 以及作为一个很好的兼容性例子 兼容性 基本的 任何接口就是必须与使用者维护的合同 合同被破坏了,兼容性也就被破坏了 一个好的Symbian 开发者应该理解 为了扩展组件,接口中什么能以及什么不能修改 而不需要破坏源码或者二进制的兼容性 兼容性的等级 理解源码的、二进制的、库的、语义的,以及前向和后向兼容 前向和后向兼容 兼容性存在于两个方向 前向和后向 当一个组件被更新时 是以这样的方法,即其他使用组件原来版本的代码 还能继续与更新的版本一起工作 这是后向可兼容变化 当软件 能与组件更新后版本一起工作 也能跟以前的版本一起工作 这种改变叫做前向可兼容 前向和后向兼容 新代码与旧代码一起工作 例如 应用程序使用现有的库 该库被更新到一个新的版本 如果应用程序与新库一起工作 能够保持跟旧库工作一样的行为 那么新的库就保持了后向可兼容的关系 即——新代码可以和就代码一起工作 旧代码与新代码一起工作 一个前向可兼容关系 需要一些巧妙的方法还能够获得 如果库的早期版本 替换了现有的库 而应用程序能够继续以相同的方式工作 则前期版本的库 被称为有前向可兼容关系 即——旧代码跟新代码一起工作 前向和后向兼容 后向兼容性 是在进行组件的增量发布时的主要目标 而前向兼容性则是额外的需要 一些修改是不能前向可兼容的 例如修改bug 它从本质上是在修改之前的版中不能正确工作的 源代码兼容 如果对一个组件进行了修改 而依赖它的组件可以重新编译 而不需做任何修改 这可以说是源代码可兼容的修改 源代码可兼容修改的一个例子 是对一个导出函数进行内部bug修正 它不要求修改函数的声明 即组件的接口 源代码兼容 典型的源代码不兼容的修改 会修改成员函数的内部 使得它可能发生Leave,而以前的版本不会这样 为了严格遵守命名规范 函数的名称可以必须增加后缀L 源代码兼容 源代码可兼容修改 并不意味着依赖的组件不需要重新编译 而是它们不需要修改就能够重新编译成功. 二进制兼容 二进制兼容即一个组件依赖于另一个组件 在它所依赖的组件被修改以后 还能够继续运行 而不需要重新编译或重新链接 这种兼容性是跨越编译和链接边界的 源代码和二进制兼容 二进制可兼容修改的一个例子 是增加类的公开非虚函数 它是按照序号从库中导出的 它位于以前导出的函数之后 客户端组件 它依赖于原来版本的库 也不会受到导出列表末尾新添加函数的影响 因此,这种修改是二进制可兼容的,也是后向兼容的 源代码和二进制兼容 如果添加新的函 到类中,会引起导出函数序号的重新排序 这种修改就不是二进制可兼容的 虽然它仍然是源代码可兼容的,即重新编译不需要修改代码 依赖的代码必须重新编译 否则它使用新的非法序号 来识别导出的函数 类级和库库的兼容 在类级维护兼容性意味着: 确保函数继续保持与最迟文档记录相同的语义 没有公开看访问的数据被移除 或者减低可访问性 类对象的大小也没有改变 维护库级兼容性意味着确保: DLL导出的API函数保持相同的序号 并且参数和返回值也是兼容饿. 防止兼容性中断什么是不能改变的? 知道类的哪些属性在大小上的改变会中断兼容性 理解类级修改会中断源代码兼容性 理解哪些类级修改会中断二进制兼容性 理解哪些二进制级修改会中断二进制兼容性 理解哪些函数级修改会中断二进制和源代码兼容性 就哪些修改会导致二进制兼容性中断角度,区分可派生和不可派生类 类对象的大小必须不改变 改变一个类对象的大小 例如 通过增加或移除数据 将引起二进制兼容性的中断 除非它能保证: 类不是外部可派生的 即构造函数没有从定义它的DLL中导出 分配对象的唯一代码 位于被改变的组件/DLL中 或者它有非公开的构造函数,该函数组织它从栈上派生 类具有虚析构函数 类对象的大小必须不改变 对象需要分配栈上的内存大小 是确定的 对每个组件,在构建时 改变对象的大小 将影响以前编译的客户端代码 除非客户端保证实例化该对象 只在堆中 例如,使用NewL() 工厂函数 类对象的大小必须不改变 另外 访问对象中的数据成员 是通过指针偏移量实现的 如果类的大小改变了 例如,增加了一个数据成员 派生类的数据成员的偏移量 就变成非法了 类对象的大小必须不改变 为确保一个类的对象 不能被派生或实例化 除了由类的成员或友元 它应该具有私有的、非内联、非导出的构造函数 简单的的不去声明任何构造函数 是不够的 因为编译器会生成隐式的公共缺省构造函数 类对象的大小必须不改变 如果一个类需要缺省构造函数 它应当被定义为私有的 然后在源文件中实现 或者在可以公开访问的地方,它不是内联函数
文档评论(0)