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

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. 增加返回值而原来apivoid。。可以直接增加返回值,或者返回在某个成员变量上5

5.8. Threadlocal5

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

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

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

 

 

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  ,不要自己写一瓦代码,麻烦的.

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

 

例如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. 增加返回值而原来apivoid。。可以直接增加返回值,或者返回在某个成员变量上

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.0api,如何慢慢切换到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

 

posted @ 2016-10-10 00:22  attilaxAti  阅读(71)  评论(0编辑  收藏  举报