API 设计二三事

标签: Programming api javascript jquery seajs | 发表时间:2011-05-09 12:34 | 作者:lifesinger 烙饼
出处:http://lifesinger.wordpress.com

所有程序员都是 API 设计者。

很认可 Dan Webb 的这句话。近期刚好也有一些思考,总结分享下。

可预测性

jQuery 很优秀,原由之一就是其 API 具有很强的可预测性。比如我们看到这样一段代码:

var container = $('#container');
container.append('<p>paragraph</p>');
container.append($('#some'));
// snip...

会想是否可以写成:

var container = $('#container');
container.append('<p>paragraph</p>', $('#some'));
// snip...

一试,果然可以,很让人欣喜。这样,不用详细阅读文档,根据直觉,就可以推测出 API 的一些高级用法,并且记忆深刻(因为是自己探索发现出来的)。

我们可能会好奇,是什么让我们拥有这个“直觉”?这和个人的编程经验甚至生活经验有关。比如对我来说,是因为用过 Array.push 的“高级用法”:

var items = [];
items.push(1, 2, 3);

人类大脑的联想功能非常强大,看似不相关的一些体验,在暗藏的潜意识里会汇聚交融。这简直让我想转行去研究大脑的运行机理,太迷人了。

联想与个体的经验相关,这意味着有些代码,在不同个体里触发的联想不一样:

var words = ['first', 'second', 'third'];
var result = [];
for (var i = 0; i < words.length; i++) {
  result.push(words[i].toUpperCase());
}

上面这段代码,会让你产生怎样的重构思路?可能会想起 forEach, 我第一直觉里联想到的是 map:

var words = ['first', 'second', 'third'];
var result = words.map(function(word) {
  return word.toUpperCase();
});

注意 map 在 IE 低版本里不支持,我们可以用 underscore 来封装。

上面的例子很简单,但足以说明问题。更复杂点的,比如 reduce, yield, let 等等,一旦我们接触过,感受过其强大,就会不知不觉想随时随地享用之,并且觉得很自然,觉得本就应该如此。

这就是语言学习上的技术视野。在我幼年时,肉是很奢侈的。家乡有句俗话:“没吃过猪肉,总见过猪跑”。我小时候见过各种猪跑,因此对猪的视野很广。现在专职搞 Web 开发,也得多看看猪跑,不必太深入,比如 yield 的深层机制,除非你真的感兴趣。

扯远了,回到本文主题。

只戴一顶帽子

很喜欢霍华德•毕哈在《将心注入》一书中的这个比喻。在我们的职业发展道路上,我们要弄清楚自己的定位,要保持专注。“只戴一顶帽子”,能让我们在专业道路上走得更远更深。在 API 设计里也是如此,比如听得耳朵起茧的职责单一原则,强调的也是别给一个类或一个方法戴上多顶帽子。

jQuery 1.6 有个很重要的非兼容性变化

&gt;input type="checkbox" checked="checked" /&lt;
elem.checked	                           true (Boolean)
$(elem).prop("checked")	           true (Boolean)
elem.getAttribute("checked")	  "checked" (String)
$(elem).attr("checked")(1.6+)	  "checked" (String)
$(elem).attr("checked")(pre-1.6) true (Boolean)

在 1.6 以前,attr 方法戴了两顶帽子:可以处理 attribute, 又可以处理 property. 带来的问题是,社区会误用 attr 方法。1.6 发布后,虽然导致了不兼容,但从长远来看,attr 方法如释重负,能更加关注做好本职工作了。

一个反例是 RequireJS 里,对 require 的“寄以厚望”,导致 require 方法一会是动态加载,一会是静态加载,一会又是获取模块接口,戴了很多帽子,这着实很恼火。

适度灵活

做一件事情只有一种方法,但可以有多种方式。还拿 append 来举例:

var container = $('#container');
container.append(['<p>paragraph</p>', $('#some')]);
// snip...

append 多个时,直接传入数组,这也是一种很自然的联想(和 Array.concat 逻辑一致)。适度灵活最难的是如何判断是适度而不是过犹不及。

Dan Webb 提到的以下几点很值得思考:

  • 对语言本身和标准类库,用户已经熟悉一些约定,复用这些约定很重要。
  • 借鉴流行类库的约定,看他们怎么做的。
  • 选项太多,导致迷惑。
  • 良好的默认配置,胜过千万选项。
  • 不要让我再读文档。
  • 记住:你永远不可能取悦所有人。
  • 选项丰富不意味着灵活性好。
  • 一切事物都可修改。

小结

不好意思,写得比较散。

总而言之,在设计 API 时,要多看猪跑,要多思多想多权衡。要深入了解用户的实际使用场景,同时又要有勇气带领用户去不曾到过到但去了就不再想回来的地方。


相关 [api 设计] 推荐:

Java API 设计清单 « 友好的API

- - 东西
在设计Java API的时候总是有很多不同的规范和考量. 与任何复杂的事物一样,这项工作往往就是在考验我们思考的缜密程度. 就像飞行员起飞前的检查清单,这张清单将帮助软件设计者在设计Java API的过程中回忆起那些明确的或者不明确的规范. 本文也可以看作为“ API设计指南”这篇文章的附录. 我们还准备了一些前后比对的例子来展示这个列表如何帮助你理清设计需求,找出错误,识别糟糕的设计实践以及如何寻找改进的时机.

API 设计二三事

- 烙饼 - 岁月如歌
所有程序员都是 API 设计者. 很认可 Dan Webb 的这句话. 近期刚好也有一些思考,总结分享下. jQuery 很优秀,原由之一就是其 API 具有很强的可预测性. 这样,不用详细阅读文档,根据直觉,就可以推测出 API 的一些高级用法,并且记忆深刻(因为是自己探索发现出来的). 我们可能会好奇,是什么让我们拥有这个“直觉”.

RESTful API 设计指南

- - 阮一峰的网络日志
网络应用程序,分为前端和后端两个部分. 当前的发展趋势,就是前端设备层出不穷(手机、平板、桌面电脑、其他专用设备......). 因此,必须有一种统一的机制,方便不同的前端设备与后端进行通信. 这导致API构架的流行,甚至出现 "API First"的设计思想. RESTful API是目前比较成熟的一套互联网应用程序的API设计理论.

Web API 设计摘要

- - CSDN博客架构设计推荐文章
最近读了一本微电子书 Brian Mulloy 所著《Web API Design》感觉颇多收获,特对其内容做了个整理摘要以便回顾其观点精华以指导日常工作中的设计思路. 本文主要讲述 Web API 设计,追求一种更务实的 REST 风格. 正如作者所说 REST 是一种架构风格,而非严格的标准,没必要在形式定义上去做过多真论,到底什么才是真正的 REST.

Web API设计方法论

- - 博客园_知识库
  英文原文: A Web API Design Methodology.    为 Web 设计、实现和维护 API 不仅仅是一项挑战;对很多公司来说,这是一项势在必行的任务. 本系列 将带领读者走过一段旅程,从为 API 确定业务用例到设计方法论,解决实现难题,并从长远的角度看待在 Web 上维护公共 API.

API 接口设计规范

- - 掘金后端
这篇文章分享 API 接口设计规范,目的是提供给研发人员做参考. 规范是死的,人是活的,希望自己定的规范,不要被打脸. url?后面的参数,存放请求接口的参数数据. 请求头,存放公共参数、requestId、token、加密字段等. Body 体,存放请求接口的参数数据. 调用方需向服务方申请 appKey(请求时使用) 和 secretKey(加密时使用).

思考系统API设计的问题

- edware_love - C++博客-首页原创精华区
最近正好在思考系统API设计中考量的一些问题,. 我现在的理解是这样的,假设有巨大的真实内存. windows首先将高2G的内存自己占了,用作各种内核对象. 这2G内存共享给每个进程,但进程不能直接访问,只能通过windows给定的函数访问. : 然后每个进程都给他2G内存,进程如果创建自己的对象就放到自己那2G内存里面,如果要建立内核对象就放到共享的那高2G里面去.

如何设计一个优秀的API

- - 标点符
到目前为止,已经负责API接近两年了,这两年中发现现有的API存在的问题越来越多,但很多API一旦发布后就不再能修改了,即时升级和维护是必须的. 一旦API发生变化,就可能对相关的调用者带来巨大的代价,用户需要排查所有调用的代码,需要调整所有与之相关的部分,这些工作对他们来说都是额外的. 如果辛辛苦苦完成这些以后,还发现了相关的bug,那对用户的打击就更大.

14.app后端如何设计api

- - CSDN博客推荐文章
app和后端的交互,一般都是通过后端提供的api实现. api的设计,估计很多刚进入app后端的小伙伴会一无头绪,不知道怎么入门. 下面根据自己3年的app后端经验,总结出下几个api设计原则,给小伙伴参考.   这个问题在以前发表的文章“7.app和app后端的通讯”中其实已经回答了,这里再重复一次.

企业级 API 网关的设计

- - IT瘾-dev
转载本文需注明出处:微信公众号EAWorld,违者必究. 三、企业级API网关需要具备的条件. 四、业界常用的API网关方案. 五、如何设计一个好的企业级API网关产品. API Gateway(APIGW / API 网关),顾名思义,是出现在系统边界上的一个面向API的、串行集中式的强管控服务,这里的边界是企业IT系统的边界,主要起到隔离外部访问与内部系统的作用.