Submitted by gouki on 2013, July 1, 10:05 AM
说起来,提供API供客户端调用,已经都做了两年多了,这两年多里,辛酸泪一把,API上线后,随着客户端版本的不停升级,功能越做越多,API越来越复杂,这时候,你TMD还得兼容旧系统,一点点的累积,过了半年,一看,还有N多人在用旧系统,想死的心都有了。开新接口?旧接口就不管了?这也不是一个办法。。。
所以,看到这篇文章的时候,我转一下,顺便自己也学一下,别人说的不一定就是对的,偏听则暗,兼听则明嘛 。(作者提供的API和我提供的不算一致,但也差不了很多,原来。。。。都是两年多,被这两年折腾的吧?)
原文来自:http://www.biaodianfu.com/how-to-design-a-good-api.html
到目前为止,已经负责API接近两年了,这两年中发现现有的API存在的问题越来越多,但很多API一旦发布后就不再能修改了,即时升级和维护是必须的。一旦API发生变化,就可能对相关的调用者带来巨大的代价,用户需要排查所有调用的代码,需要调整所有与之相关的部分,这些工作对他们来说都是额外的。如果辛辛苦苦完成这些以后,还发现了相关的bug,那对用户的打击就更大。如果API经常发生变化,用户就会失去对提供方失去信心,从而也会影响目前的业务。
但是我们为什么还要修改API呢?为了API看起来更加漂亮?为了提供更多功能?为了提供更好的性能?还是仅仅觉得到了改变了时候了?对于用户来说,他们更愿意使用一个稳定但是看起来不那么时髦的API,这并不意味着我们不再改进API了。当糟糕的API带来的维护成本越来越大时,我想就是我们去重构它的时候。
如果可以回头重新再做一遍,那么我心目中的优秀的API应该是怎么样的?
判断一个API是否优秀,并不是简单地根据第一个版本给出判断的,而是要看随着时间的推移,该API是否还能存在,是否仍旧保持得不错。槽糕的API接口各种各样,但是好的API接口对于用户来说必须满足以下几个点:
- 易学习:有完善的文档及提供尽可能多的示例和可copy-paste的代码,像其他设计工作一样,你应该应用最小惊讶原则。
- 易使用:没有复杂的程序、复杂的细节,易于学习;灵活的API允许按字段排序、可自定义分页、 排序和筛选等。一个完整的API意味着被期望的功能都包含在内。
- 难误用:对详细的错误提示,有些经验的用户可以直接使用API而不需要阅读文档。
而对于开发人员来说,要求又是不一样的:
- 易阅读:代码的编写只需要一次一次,但是当调试或者修改的时候都需要对代码进行阅读。
- 易开发:个最小化的接口是使用尽可能少的类以及尽可能少的类成员。这样使得理解、记忆、调试以及改变API更容易。
如何做到以上几点,以下是一些总结:
1、 面向用例设计
如果一个API被广泛使用了,那么就不可能了解所有使用该API的用户。如果设计者希望能够设计出被广泛使用的API,那么必须站在用户的角度来理解如何设计API库,以及如何才能设计出这样的API库。
2、 采用良好的设计思路
在设计过程中,如果能按照下面的方式来进行设计,会让这个API生命更长久
- 面向用例的设计,收集用户建议,把自己模拟成用户,保证API设计的易用和合理
- 保证后续的需求可以通过扩展的形式完成
- 第一版做尽量少的内容,由于新需求可以通过扩展的形式完成,因此尽量少做事情是抑制API设计错误的一个有效方案
- 对外提供清晰的API和文档规范,避免用户错误的使用API,尤其是避免API(见第一节)靠后级别的API被用户知晓与误用
除此之外,下面还列出了一些具体的设计方法:
- 方法优于属性
- 工厂方法优于构造函数
- 避免过多继承
- 避免由于优化或者复用代码影响API
- 面向接口编程
- 扩展参数应当是便利的
- 对组件进行合理定位,确定暴露多少接口
- 提供扩展点
3、 避免极端的意见
在设计API的时候,一定要避免任何极端的意见,尤其是以下几点:
- 必须漂亮(API不一定需要漂亮)
- API必须被正确地使用(用户很难理解如何正确的使用API,API的设计者要充分考虑API被误用的情况:如果一个API可能会被误用,那么它一定会被误用)
- 必须简单(我们总会面临复杂的需求,能两者兼顾的API是更好的API)
- 必须高性能(性能可以通过其他手段优化,不应该影响API的设计)
- 必须绝对兼容(尽管本文一直提到如何保证兼容,但是我们仍然要意识到,一些极少情况下会遇到的不兼容是可以容忍的)
4、 有效的API评审
API设计完成以后,需要经过周密的设计评审,评审的重点如下:
- 用例驱动,评审前必须提供完善的使用用例,确保用例的合理性和完备性。
- 一致性,是否与系统中其他模块的接口风格一致,是否与对称接口的设计一致。
- 简单明了,API应该简单好理解,容易学习和使用的API才不容易被误用,给我们带来更多的麻烦。
- API尽可能少,如果一个API可以暴露也可以不暴露,那么就不要暴露他,等到用户真正有需求的时候再将它成为一个公开接口也不迟。
- 支持持续改进,API是否能够方便地通过扩展的方式增加功能和优化。
5、 提高API的可测试性
API需要是可测试的,测试不应依赖实现,测试充分的API,尤其是经过了严格的“兼容性整合测试”的API,更能保证在升级的过程中不出现兼容性问题。兼容性整合测试,是指一组测试用例集合,这组测试用例会站在使用者的立场上使用API。在API升级以后,再检测这组测试用例是否能完全符合预期的通过测试,尽可能的发现兼容性问题。
6、 保证API的向后兼容
对于每一个API的设计者来说,都渴望做到“向后兼容”,因为不管是现在的API用户,还是潜在的API用户,都只信任那些可兼容的API。但向后兼容有多个层次上的意义,而且不同层次的向后兼容,也意味着不同的重要性和复杂度。
7、 保持逐步改善
过去我们总希望能将现有的“不合理”的设计完全推翻,然后按照现在“美好”的思路,重新设计这个API,但是在一段时间以后,又会碰到一样的状况,需要再推翻一次。 如果我们没有有效的逐步改善的办法,依靠推翻现有设计,重新设计API只能让我们回到起点,然后重现之前的过程。 要有一套行之有效的持续改善的办法来在API兼容的同时,改善API使之更好。
8、 把握API的生命周期
每一个API都是有生命周期的,我们需要让API的生命周期更长,并且在API的生命周期结束时能让其平滑的消亡。
- 告诉用户我们是如何设计的,避免误用,提供指导,错误的使用往往是缩短API寿命的一大杀手
- 提供试用期,API不可能一开始就是稳定,经过试用的API才能有更强的生命力
- 为API分级:内部使用;二次开发使用;开发或试用中;稳定;弃用API。避免API被滥用的同时,我们可以通过调整API的级别,来扩大其影响力,也能更优雅的结束一个API的生命周期。
开发API的过程其实就是一个沟通交流的过程。沟通的双方就是API用户和API设计者。
9、 一些具体的实施方案
在一个API不可避免要消亡或者改变的时候,我们应该接受并且面对这个事实,下面列举了几种保证兼容性的前提下,对API进行调整的办法:
- 将API标记为弃用,重新建立一个新的API。如果一个API不可避免要被消亡,这是唯一的办法。
- 为其添加额外的参数或者参数选项来实现功能添加
- 将现有API拆成两部分,提供一个精简的核心API,过去的API通过封装核心API上实现。这通常用于解决用户需要一个代码精简的版本时。
- 在现有的API基础上进行封装,提供一个功能更丰富的包或者类
一些好的API示例:
- Flickr API,这里是文档的示例,同时提供了一个非常方便的API测试工具。
- Mediawiki API
- Ebay API,这里有一个非常详尽的文档示例。
----EOF---
总之,尽信书则不如无书,借鉴一下总还是没错的
PHP | 评论:0
| 阅读:19610
Submitted by gouki on 2013, June 30, 11:41 PM
本期thinkinlamp应该算是第三期了吧?每一期都有热点,这一期也不例外
只是这一期都集中在百度和微博的爆点上了,都在讲自己怎么优化怎么优化,怎么提高性能,他们也都用图例说明了自己的架构原来是多么的复杂,这些离我们都太远了,其实大家也都明白,PHP能做的事情很多,不仅仅局限于前台,但受限于语言的特性,对于多线程之类的不适合用它来做。也正因此,他们几个都在尝试用其他方式 来避开这个问题,让刀用在刀刃上。
其中有一点就是扩展的问题,百度的人在认为扩展能不用就不用。而鸟哥则认为合理的利用扩展可以有效的提高 性能
然后就是另外三个让我有兴趣的话题了:hm的全文检索/老高的开发规范/梁枫的PHP在web之外
hm的全文检索我是用过了,性能上还是不错,只是当时我的需求是任意字符都必须要能够出搜索结果,但是基于分词的话,就没有办法这么准确。所以,有时候就很纠结。。
老高的几个规范其实在开发中也已经遇到,但有时候真的是为了赶时间就忽略 了这些,不过,在review的时候,偶尔会对这些问题进行修复,但不是每次都保证一定能发现问题,如果到后期遇到了,恐怕就真的很难再改了
梁枫的在WEB之外,是真的让我耳目一新, 无论是直接读ttyACMD之类的文件来使得用PHP与其他设备交互,在linux中,所有的一些都是文件,所以什么都能操作,这点就比windows方便很多。梁枫演示的,用PHP在屏幕画图,视频播放器等功能,真的让我感觉PHP有很多功能没有开发出来。不要忽略了PHP在其他方面的作用。事实上,我就经常用PHP来做运维工具,毕竟用PHP写脚本,对我来说,比shell/bash之类的快很多,而且功能也更强劲
------
顺便,中午的时候,居然有演出,四位朋友的友情演出,才让我突然想起,原来今天是家驹的忌日。从第一次听他的歌到现在居然都快20年了,家驹走好
------
今天的分享中让我记忆犹新的就是几个:1、规范一定要能落地;2、尽量用技术来支撑规范;3、开发的时候就最好把安全都先考虑好;4、PHP能做很多事,就看你敢不敢想
性能有时候虽然重要,但我还是觉得,如果能够加速迭待,那才是更好的。准备开始尝试下一个项目中使用yaf了。理由真的有几点,一是纯C框架,效率有上升,2是有PHP的复刻版,即使真的装不了扩展,也能用这个复刻版
YAR,YAC都还可以考虑,先忍着点。。。。yar因为RPC的不是每个项目里都能够用得上,YAC的话,如果不是因为他无锁,都不太想用,但是又太新了,也不是每台机器上都能使用,所以就先不作考虑了,不过可以尝试在自己的项目里小小的应用一下。。。
鸟哥的扩展太多了。。。小心的用,哈
Tags: thinkinlamp
PHP | 评论:0
| 阅读:16506
Submitted by gouki on 2013, June 30, 12:16 AM
在修改数据库结构的时候,突然间报这个错:Data truncated for column 'xxxxx' at row 1,xxxxx是数据库的字段名。
检查了一下,原来刚才在修改字段的时候,加了一个允许 null,然后默认的值都变成null,可是后来我又修改表结构为not null default '';所以,报会这个错
到数据库里:update xxxx set xxx = '';,再修改表结构,一切Over。
Baby | 评论:1
| 阅读:32280
Submitted by gouki on 2013, June 28, 6:23 PM
虽然不是设计师,但还是会用到这些东西,所以还是记录一下。。我平时只知道 #CCC,#FFF,#888,#000,还有几个英文,什么black,red,blue之类的。所以保存一下,以后查起来也比较方便
白色 |
255 255 255 |
FFFFFF |
红色 |
255 0 0 |
FF0000 |
绿色 |
0 255 0 |
00FF00 |
蓝色 |
0 0 255 |
0000FF |
洋红 |
255 0 255 |
FF00FF |
墨绿 |
0 255 255 |
00FFFF |
黄色 |
255 255 0 |
FFFF00 |
黑色 |
0 0 0 |
0 |
爱丽丝兰 |
240 248 255 |
F0F8FF |
碧绿 |
112 219 147 |
70DB93 |
巧克力色 |
92 51 23 |
5C3317 |
蓝紫色 |
159 95 159 |
9F5F9F |
黄铜 |
181 166 66 |
B5A642 |
亮金 |
217 217 25 |
D9D919 |
褐色 |
166 42 162 |
A62AA2 |
青铜 |
140 120 83 |
8C7853 |
青铜2 |
166 125 61 |
A67D3D |
藏青 |
95 159 159 |
5F9F9F |
亮铜 |
217 135 25 |
D98719 |
铜色 |
184 115 51 |
B87333 |
珊瑚色 |
255 127 0 |
FF7F00 |
矢车菊兰 |
66 66 111 |
42426F |
深褐色 |
92 64 51 |
5C4033 |
深绿色 |
47 79 47 |
2F4F2F |
深铜绿色 |
74 118 110 |
4A766E |
|
|
|
深橄榄绿 |
79 79 47 |
4F4F2F |
紫色 |
153 50 205 |
9932CD |
深紫色 |
135 31 120 |
871F78 |
深石板蓝 |
107 35 142 |
6B238E |
深石板灰 |
47 79 79 |
2F4F4F |
深黄褐色 |
151 105 79 |
97694F |
深蓝玉色 |
112 147 219 |
7093DB |
暗木色 |
133 94 66 |
8.55E+44 |
暗灰 |
84 84 84 |
545454 |
暗玫瑰色 |
133 99 99 |
856363 |
长石色 |
209 146 117 |
D19275 |
砖红色 |
142 35 35 |
8E2323 |
草绿 |
35 142 35 |
2.38E+25 |
金色 |
205 127 50 |
CD7F32 |
秋叶色 |
219 219 112 |
DBDB70 |
灰色 |
192 192 192 |
C0C0C0 |
铜绿色 |
82 127 118 |
527F76 |
黄绿色 |
147 219 112 |
93DB70 |
军绿 |
33 94 33 |
2.15E+23 |
印第安红色 |
78 47 47 |
4E2F2F |
土黄 |
159 159 95 |
9F9F5F |
浅蓝 |
192 217 217 |
C0D9D9 |
浅灰 |
168 168 168 |
A8A8A8 |
浅铜蓝 |
143 143 189 |
8F8FBD |
浅木色 |
233 194 166 |
E9C2A6 |
|
|
|
浅绿 |
50 205 50 |
32CD32 |
橙色 |
228 120 51 |
E47833 |
栗色 |
142 35 107 |
8E236B |
中绿 |
50 205 153 |
32CD99 |
中蓝 |
50 50 205 |
3232CD |
中草绿 |
107 142 35 |
6B8E23 |
中秋叶色 |
234 234 174 |
EAEAAE |
中紫色 |
147 112 219 |
9370DB |
中海绿 |
66 111 66 |
426F42 |
中石板蓝 |
127 0 255 |
7F00FF |
中春绿 |
127 255 0 |
7FFF00 |
中蓝玉色 |
112 219 219 |
70DBDB |
|
|
|
中紫红色 |
219 112 147 |
DB7093 |
中木色 |
166 128 100 |
A68064 |
夜蓝色 |
47 47 79 |
2F2F4F |
海蓝色 |
35 35 142 |
23238E |
氖蓝色 |
77 77 255 |
4D4DFF |
氖粉红色 |
255 110 199 |
FF6EC7 |
新夜蓝色 |
0 0 156 |
00009C |
新黄褐色 |
235 199 158 |
EBC79E |
暗金色 |
207 181 59 |
CFB53B |
橘色 |
255 127 0 |
FF7F00 |
橘红 |
255 36 0 |
FF2400 |
淡紫 |
219 112 219 |
DB70DB |
淡绿 |
143 188 143 |
8FBC8F |
|
|
|
粉红 |
188 143 143 |
BC8F8F |
棕色 |
234 173 234 |
EAADEA |
石英色 |
217 217 243 |
D9D9F3 |
富兰色 |
89 89 171 |
5959AB |
橙红色 |
111 66 66 |
6F4242 |
猩红 |
140 23 23 |
8C1717 |
海绿 |
35 142 104 |
2.38E+70 |
半甜巧克力色 |
107 66 38 |
6B4226 |
赭色 |
142 107 35 |
8E6B23 |
银色 |
230 232 250 |
E6E8FA |
天蓝 |
50 153 204 |
3299CC |
石板蓝 |
0 127 255 |
007FFF |
|
|
|
香粉红 |
255 28 174 |
FF1CAE |
春绿 |
0 255 127 |
00FF7F |
钢蓝 |
35 107 142 |
236B8E |
夏天的天空 |
56 176 222 |
38B0DE |
黄褐色 |
219 147 112 |
DB9370 |
蓝玉色 |
173 234 234 |
ADEAEA |
暗褐色 |
92 64 51 |
5C4033 |
亮灰 |
205 205 205 |
CDCDCD |
紫罗兰色 |
79 47 79 |
4F2F4F |
紫红 |
204 50 153 |
CC3299 |
麦色 |
216 216 191 |
D8d8BF |
暗黄 |
153 204 50 |
99CC32 |
Tags: color
Misc | 评论:0
| 阅读:17195
Submitted by gouki on 2013, June 28, 1:56 PM
ios出来不少时间了,也从beta1升到了beta2,性能上感觉,也不卡了,终于也有一些话可以拿出来说了,beta1我实在是没什么好说的。。。。
说说特性吧,与ios6相比:
1、控制台可以单独呼出,类似android的管理,不过android是从上面往下呼出,ios从下往上(屏幕上一个向上,一个向下的箭头,看起来好恶心),不过方便是方便了。可以控制声音、亮度、还有快捷开关,还有电筒、计算器、闹钟等小工具;确实方便了很多,比如计算器我就不用再找了(突然觉得就是把下面的4个快捷方式变成了8个)
2、蜂窝管理:可以针对APP使用蜂窝数据,可以屏蔽某些APP用手机流量,很不错
3、照相的速度快了很多,增加了一个正方型的照相,以前打开HDR的时候,拍张照要等半天,现在就和以前一样快了,不知道是从哪里优化的。。。还是说因为支持了多进程,把它扔在后台而不影响拍照了?
4、APP更新自动下载。这个功能比较有意思,也比较方便,最起码你在无线的时候你就不用关心APP是否在更新,它会帮你悄悄的更新完了,如果。。。你用苹果皮带的无线功能,估计你会哭。。。(中国移动推出的td-scdma的苹果皮,我就是在上面吃药了,流量一下子超了200多M,看了下,还好,我都没有大型 APP,可就算更新一个淘宝,TMD也要40多M啊)
5、spotlight,原来是单独一屏,现在也没有了,只要在主界面手指下划,在顶部就会出现一个搜索框。感觉有点卡,不如以前的单独一屏。。。但方便是方便了
6、输入法更新了。原来的笔画输入,连丁、士这类词都打不出,只能用拼音,现在。。。。都可以输入了,听说要开放输入法API,但估计不太可能。。。
由于一些其他界面的东西,官网上、各种各样的网站都有说明,所以我这里就不多说了。。。
一些小问题:
1、微信,发表图文的时候,只能选择拍照。其他功能都会有小问题:长信息展开不正常,从相册选择照片不正常,文字信息看不到第一行等等。其实也就是朋友圈有各种小问题
2、锁屏的时候,桌面图片好象会有切边,不太好看
3、接电话的时候,偶尔会突然打开扬声器,有几次差点吓死我。。。
小瑕疵,可以忍受。
当然如果你要刷回去,可能是有点问题的,听说苹果已经不允许刷回6.1.2了。考虑一下再说哦
Tags: ios
Flutter | 评论:0
| 阅读:17448