Atitit Atitit.软件兼容性原理----------API兼容 Qa7

1. 兼容性的重要性与反面教材1

2. 提升兼容性的原则2

2.1. What 与how 分离2

2.2. 老人老办法,新人新办法,只新增,少修改,莫删除3

2.3. 计划赶不上变化,永远api修改也不可能整齐划一,反而带来不兼容的风险3

3. 把握API的生命周期andAPI分级3

4. 对兼容性保持友好的api设计方法3

4.1. 细粒度的方法3

4.2. Ioc容器动态配置3

4.3. 把你的method()视为全局global的,确保每一个方法都不重名尽可能。。不要幻想有模块命名空间等,这也是为了方便用户查询。。3

4.4. Api版本管理与 细粒度的方法Api版本管理4

4.5. 使用ioc方法。 容器正是个好东西啊4

5. 保持api兼容性的新版本升级方法4

5.1. 不要重构以前的api内部具体实现,以达到无缝升级的效果4

5.2. 不要向已经发布的接口里添加成员;创建新的接口来避免版本问题4

5.3. 创建新的api应该使用什么标准???4

5.4. 增加功能 增加新api  而不是  修改旧的api5

5.5. 修改api (那就是尽可能不要修改api,使用增加来代替)5

5.6. 增加参数 (可以通过可变参数json来扩充参数)5

5.7. 增加返回值而原来api是void。。可以直接增加返回值,或者返回在某个成员变量上5

5.8. Threadlocal5

5.9. 避免极端的意见在设计API的时候,一定要避免任何极端的意见,6

6. 如何废弃api (使用depre标识,千万不要删除6

7. 我们的app现在使用v1.0版api,如何慢慢切换到2.0呢7

1. 兼容性的重要性与反面教材

Java 与c#的兼容性走很好,win也很关注兼容性...

反面教材啊,也有啊..python3, cocos2d-js  v3.x的问题

一旦上述提到的5个API中的任何一个发生变化,可能会给他们带来巨大的代价,用户需要排查所有调用的代码,需要更改一些协议,需要调整所有与之相关的部分,这些工作对他们来说都是额外的,在预期之外的。如果辛辛苦苦完成这些以后,还在测试过程中发现了相关的bug,那对用户的打击就更大了。如果API经常发生变化,用户就会失去对这段程序的信任,他们会更倾向自己获得源代码以后,按照自己的需求进行修改,自行维护一个内部的API比调用一个不断发生变化的外部API要容易接受的多,虽然这样做和我们协同开发、模块化开发的初衷是完全相悖的

保护用户在API上的已有工作
用户过去在调用API、基于API开发所做的工作,这样才能给用户带来价值的同时,不破坏他们过去的劳动成果

2. 提升兼容性的原则

2.1. What 与how 分离

例如,ui ,使用dsl  html5 css来定义 ui ,不要使用native winform式的3gl语言

后端, 数据操作使用linq,sql  ,不要自己写一瓦代码,麻烦的.

别的例如游戏,使用接口模式..定义一些api当dsl ,,使用实现来不同的实现..

例如cocos的定义场景,很麻烦的

// add bg

// var size = cc.director.getWinSize();

this.bgSprite = new cc.Sprite(res.BackGround_png);

this.bgSprite.attr({

x: size.width / 2,

y: size.height / 2,

});

this.addChild(this.bgSprite, 0);

使用dsl  html5 走容易的,还有标准的dw ide支持..可视化的ui设计.很方便的实现后端重构,不影响用户..

<div style=”background:url(xxxxx.jpg); x:0; y:0 ”>  </div>

后端解析这个html dsl 定义,生成canvas对象走ok...

2.2. 老人老办法,新人新办法,只新增,少修改,莫删除

2.3. 计划赶不上变化,永远api修改也不可能整齐划一,反而带来不兼容的风险

3. 把握API的生命周期andAPI分级

· 为API分级:内部使用;二次开发使用;开发或试用中;稳定;弃用API。避免API被滥用的同时,我们可以通过调整API的级别,来扩大其影响力,也能更优雅的结束一个API的生命周期。

4. 对兼容性保持友好的api设计方法

4.1. 细粒度的方法

方法api功能越细,越任意单独升级方法版本

4.2. Ioc容器动态配置

兼容性的神器。。

4.3. 把你的method()视为全局global的,确保每一个方法都不重名尽可能。。不要幻想有模块命名空间等,这也是为了方便用户查询。。

一般使用事件做uuid后缀,基本可以确保不同。

4.4. Api版本管理与 细粒度的方法Api版本管理

可以直接在方法签名增加  xxx_v2()这样的实现版本方法即可。

粗粒度的api版本管理使用ioc组合不同的细粒度api

4.5. 使用ioc方法。 容器正是个好东西啊

5. 保持api兼容性的新版本升级方法

5.1. 不要重构以前的api内部具体实现,以达到无缝升级的效果

除非绝对必要,不要重构以前的api具体实现,而是新增一个。。。重构以前的api难免增加bug,带来不稳定。。 当然api接口的话,可以保留。。

就像java,很多升级都是重构以前的实现,可以带来更高的性能等,但风险较大,对能力要求较高。。。普通公司,还是新增为主。。这样新版本app可以使用新api,就版本app任然使用旧api即可。。

接口函数一旦发布就不能改了,要保持兼容性,拼写错误也不能改了,所以要仔细检查拼写,否则会被同行嘲笑很多年。
著名悲剧:unix 的 creat

5.2. 不要向已经发布的接口里添加成员;创建新的接口来避免版本问题

5.3. 创建新的api应该使用什么标准???

简单的,使用世界流行的,标准化的标准走ok..

例如ui方面,使用h5标准,不足了补充使用wpf,,优点是资料多啊,你都可以不需要写api文档了,直接使用这个标准的资料走ok,资料足够..

后端语言api 了??? 使用流行的java ,js  ,可以补充c#风格拉..  C++ ,obj-c不推荐..

5.4. 增加功能 增加新api  而不是  修改旧的api

最好是增加新的api。。这样不用调整老的api..添加测试工作...

当然一些很小的的调整可以直接调整老的api

一些必须修改老api的,可以变成api0模式,在新的api里面调用即可。修改bug模式。。

新api的命名可以采用 xxxV2 的模式这样就可以兼容老api。。

5.5. 修改api (那就是尽可能不要修改api,使用增加来代替)

5.6. 增加参数 (可以通过可变参数json来扩充参数)

增加参数也可以通过threadlocal方式来实现,这样就不用改动原来的方法签名

5.7. 增加返回值而原来api是void。。可以直接增加返回值,或者返回在某个成员变量上

5.8. Threadlocal

它还有一些类似的方式用来使用,就是在框架级别有很多动态调用,调用过程中需要满足一些协议,虽然协议我们会尽量的通用,而很多扩展的参数在定义协 议时是不容易考虑完全的以及版本也是随时在升级的,但是在框架扩展时也需要满足接口的通用性和向下兼容,而一些扩展的内容我们就需要 ThreadLocal来做方便简单的支持。

简单来说,ThreadLocal是将一些复杂的系统扩展变成了简单定义,使得相关参数牵连的部分变得非常容易,以下是我们例子说明:

5.9. 避免极端的意见在设计API的时候,一定要避免任何极端的意见,

尤其是以下几点:必须漂亮(API一定要漂亮吗?前文已经说过了) API必须被正确地使用(用户很难理解如何正确的使用API,API的设计者要充分考虑API被误用的情况:如果一个API可能会被误用,那么它一定会被误用) 必须简单(我们总会面临复杂的需求,能两者兼顾的API是更好的API) 必须高性能(性能可以通过其他手段优化,不应该影响API的设计) 必须绝对兼容(尽管本文一直提到如何保证兼容,但是我们仍然要意识到,一些极少情况下会遇到的不兼容是可以容忍的) 一些具体的实施方案在一个API不可避免要消亡或者改变的时候,我们应该接受并且面对这个事实,下面列举了几种保证兼容性的前提下,对API进行调整的办法:将API标记为弃用,重新建立一个新的API。如果一个API不可避免要被消亡,这是唯一的办法。 为其添加额外的参数或者参数选项来实现功能添加 将现有API拆成两部分,提供一个精简的核心API,过去的API通过封装核心API上实现。这通常用于解决用户需要一个代码精简的版本时。

6. 如何废弃api (使用depre标识,千万不要删除

在一个API不可避免要消亡或者改变的时候,我们应该接受并且面对这个事实,下面列举了几种保证兼容性的前提下,对API进行调整的办法:

· 将API标记为弃用,重新建立一个新的API。如果一个API不可避免要被消亡,这是唯一的办法。

· 为其添加额外的参数或者参数选项来实现功能添加

· 将现有API拆成两部分,提供一个精简的核心API,过去的API通过封装核心API上实现。这通常用于解决用户需要一个代码精简的版本时。

· 在现有的API基础上进行封装,提供一个功能更丰富的包或者类

7. 我们的app现在使用v1.0版api,如何慢慢切换到2.0呢

每一个api下面有许多方法。。比如m1 m2

使用ioc方法。 先搞个api2.0 ,默认加载全部1.0的方法。。然后针对需要新加或者修改的方法,做2.0版本,然后在ioc里面配置,让api2.0使用那几个新版本方法。其他的方法任然可以使用就版本,即是可以任意组合细粒度的方法啦。。

Ref参考资料

如何做到API兼容 - 百度技术博客 - 51CTO技术博客.html

如何保持API的兼容 - 永远即等待的专栏 - 博客频道 - CSDN.NET.html

atitit 软件兼容性原理与实践 v6  qa3.docx

作者:: 绰号:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿尔 拉帕努伊 )

汉字名:艾提拉(艾龙),   EMAIL:1466519819@qq.com

转载请注明来源: http://blog.csdn.net/attilax

Atiend

Atitit Atitit.软件兼容性原理----------API兼容 Qa7相关推荐

  1. Atitit.软件兼容性原理与实践 v3 q326.docx

    Atitit.软件兼容性原理与实践 v3 q326.docx 1. 架构兼容性1 2. Api兼容性1 2.1. 新api  vs  修改旧的api1 3. Web方面的兼容性(js,html)1 3 ...

  2. Atitit.提升软件Web应用程序 app性能的方法原理 h5 js java c# php python android .net

    Atitit.提升软件Web应用程序 app性能的方法原理 h5 js java c# php python android .net 1. 提升单例有能力的1 2. 减少工作数量2 2.1. 减少距 ...

  3. Atitit. 高级软件工程师and 普通的区别 高级编程的门槛总结

    Atitit.  高级软件工程师and 普通的区别 高级编程的门槛总结 1. 完备的知识体系 2 2. 编程理论/原理的掌握 2 1.1. 掌握常用的概念(ORM,IOC,AOP,event driv ...

  4. Atitit. 高级软件project师and 普通的差别 高级编程的门槛总结

    Atitit.  高级软件project师and 普通的差别 高级编程的门槛总结 1. 完备的知识体系 2 2. 编程理论/原理的掌握 2 1.1. 掌握经常使用的概念(ORM,IOC.AOP,eve ...

  5. Atiitt 可视化 报表 图表之道 attilax著 Atiitt 可视化的艺术 attilax著 v2 s51.docx Atitit.可视化与报表原理与概论 1. 、什么是可视化(这一

    Atiitt  可视化 报表 图表之道 attilax著 Atiitt  可视化的艺术 attilax著 v2 s51.docx Atitit.可视化与报表原理与概论 1. .什么是可视化(这一节有点 ...

  6. Atitit. 提升软件开发效率and 开发质量---java 实现dsl 4gl 的本质and 精髓 O725

    Atitit. 提升软件开发效率and 开发质量---java 实现dsl 4gl 的本质and 精髓  O725 1. DSL主要分为三类:外部DSL.内部DSL,以及语言工作台. 1 2. DSL ...

  7. Atitit.java swing打印功能 api  attilax总结

    Atitit.java swing打印功能 api  attilax总结 1. 打印方式有三种:2 1.1. 一是不经过任何修改,直接调用javascript中的window.print()打印.2 ...

  8. Atitit 硬件 软件 的开源工作 差异对比

    Atitit 硬件 软件 的开源工作 差异对比 1.1. 模块化,标准化,以及修改的便捷性1 1.2. 生产和发布成本 1 1.3.   3. 入行门槛搞2 1.4.  在软件业极度发达的今天,任何具 ...

  9. Atitit 桌面软件跨平台gui解决方案 javafx webview

    Atitit 桌面软件跨平台gui解决方案 javafx webview 参考文章: (1)Atitit 桌面软件跨平台gui解决方案 javafx webview (2)https://www.cn ...

  10. Atitit RSA非对称加密原理与解决方案

    Atitit RSA非对称加密原理与解决方案 1.1. 一.一点历史 1 1.2. 八.加密和解密 2 1.3. 二.基于RSA的消息传递机制  3 1.4. 基于rsa的授权验证机器码 4 1.5. ...

最新文章

  1. 清华首超新加坡国立大学,成亚洲第一;苏州大学成211学科黑马丨US News 2021
  2. 【NLP】Prompt-Tuning这么好用?
  3. CentOS 初体验十五:阿里云安装Nginx
  4. 使用JAXP对XML文档进行DOM解析
  5. c++运算符优先级总结
  6. 代码重新发布后docker服务会不会受影响_分享点经验 | 浅谈微服务架构
  7. LeetCode(303)——区域和检索 - 数组不可变(JavaScript)
  8. OpenCV-获取图像中圆线上的数据
  9. Vquery PHP 简单爬虫类
  10. vue 导出excel表格-乱码问题
  11. 周立功USBCAN-II的Python调用
  12. oracle报03113,一条SQL查询,报ora-03113的错误,请高手分析
  13. 安卓Systrace工具使用流程
  14. DXP2004/Altium Desinger 自己画元器件和封装,及注意事项
  15. android打包报错Detected multiple Kotlin daemon sessions
  16. SSD LOSS-train interation 可视化
  17. 攻防世界-re-for-50-plz-50
  18. 现代韦编三绝 新东方强浩老师自学新概念的故事
  19. Gartner发布5G网络基础设施魔力象限报告
  20. 【ArcGIS】10 流域水系提取

热门文章

  1. 系统没有安装vc9.注意是x86 32位_x86是多少位系统
  2. python三大神器之fabric
  3. C语言什么是结构体?初步学习C语言结构体三部曲
  4. 机器学习之 决策树(Decision Tree)
  5. Android进阶--android自动化测试python+uiautomator
  6. 【POJ 3062】Party(2-SAT、tarjan)
  7. matlab调用C语言
  8. 添加 identity impersonate=true userName=username password=password/,解决问题!
  9. MySQL-第十二篇管理结果集
  10. python: 列表的方法