什么是API
我们从API的功能、分类、设计、实现、用户来看什么是API。
API是应用程序组件之间通信的接口
--wiki:Application Programming Interface
In computer programming, an application programming interface (API) is a set of subroutine definitions, protocols, and tools for building application software. In general terms,** it's a set of clearly defined methods** of communication between various software components. A good API makes it easier to develop a computer program by providing all the building blocks, which are then put together by the programmer. An API may be for a web-based system, operating system, database system, computer hardware, or software library. An API specification can take many forms, but often includes specifications for routines, data structures, object classes, variables, or remote calls. POSIX, Microsoft Windows API, the C++ Standard Template Library, and Java APIs are examples of different forms of APIs. Documentation for the API is usually provided to facilitate usage. The status of APIs in intellectual property law is controversial.
可见,API一般是指一个系统对外的接口,例如:
- Libraries and frameworks
- Operating Systems
- Remote APIs
- Web APIs
抽象概念在编程中具有核心的地位,而实现上的细节被屏蔽在API的实现层,一个模块对外的抽象概念的入口就是API。
In general, abstraction is implemented by what is generically termed an Application Programming Interface (API). API is a somewhat nebulous term that means different things in the context of various programming endavours. Fundamentally, a programmer designs a set of functions and documents their interface and functionality with the principle that the actual implementation providing the API is opaque.
API分有状态和无状态两类
API应该有分面向对象的有状态API和函数式的无状态API。
有状态API
- 在C语言里,写一个结构体,针对该结构体所代表的资源,提供一组对称操作函数
- 在C++语言里,写一个类,针对这个类内部所持有的核心资源,提供一组对称操作函数
- 在Java或者C#语言里,写一个接口,针对这个接口背后可能持有的资源,提供一组对称操作函数
- 在Lua里,写一个table,针对这个table所持有的资源,提供一组对称操作函数
- 在JavaSctipt里,尽量使用面向对象的方式提供API
之所以说是有状态,是指,这组操作之间依赖了彼此操作的状态,例如:
- Open、Read、Write、Close
- Init、Load、Pub、UnInit
- Create Add、AddRange、Remove、RemoveRange、Clear
- Insert、Update、Delete
- Start、Update、Finish
公共的参数一般会在Open、Init、Create、Start的时候一次性传入、后续的Read、Write;Load、Pub;Add、Remove;多次Update等都是针对共同的资源操作,并且对资源的操作有副作用,使的资源的状态发生变化。
无状态API
- 在Http里,设计Get、Post、Put、Delete的API,也就是RESTFul API,由于HTTP连接无状态的特性,使得每次调用都是独立的,无状态的,所以设计API的时候也要考虑幂等性:同样参数的多次调用等同于一次调用。
- 在函数式语言里,提供一组操作纯函数,这些纯函数由于本身不能持有状态,每次都要求传入所有需要的参数,这些函数也保证:只要传入的参数一样,就一定等得到同样的结果。然而,当函数式语言需要处理有副作用的资源时,就必然要绕弯处理,例如引入monad。
- 在非函数式语言里,如果可以自由写函数的情况下,也会易于提供类似无状态要求的API。
API的设计原则
API设计的时候,要考虑以下几个点:
- 应该针对资源或者算法提供API
- 应该提供对称的一组函数,设计对称API的时候应该考虑不变式,也即,对资源的对称操作所抱持的资源的某种不变的性质。
- 应该提供简洁明了的函数名字
- 应该尽量减少参数个数,只添加必要的参数
- 有状态的API,应该把一组操作共同依赖的参数作为成员在初始化的时候传入
- 无状态的API,应该设计合适的共同上下文
- 应该考虑提供怎样的原子操作:例如,是否应该提供批量操作接口,Add和AddRange都提供还是只提供Add,从原子上考虑,像CreateAndXXX这种接口就不应该提供
- 考虑原子的话,那么就可能进一步需要考虑事务,让Begin和End的操作事务化
- 应该考虑接口操作的性质:
- 幂等性
- 可重入性
- 线程安全
- 并发性
- 延迟性
- 应该考虑API的同步、异步,并在整个设计里尽量保持一致
- 每组API应该都代表一种Concept,这个Concept应该类似数学的每个概念一样,都有明确的一组性质,例如代数里的Group,拓扑空间,在集合上的定义一种数学概念,这个概念就会符合一些核心的属性
- 如果你有多组API共同协作,它们就会形成一套API,多组API之间应该要有良好的协作构架,就像齿轮
- 可能的情况下让API保持可组合
- 多组API之间尽量要有分层、在层之间做到松耦合,层内做到高内聚
- API应该做到开放封闭,边界要分清。
API的实现要素
API在实现上要考虑
- API的前置假设和后置假设,实现上应该对前假设(例如参数)、后假设(例如返回值)做假设的Check
- API的实现应该考虑关键入口和关键出口的日志
- API的实现应该提供对应的测试,测试是最好的文档
- API的实现应该考虑线程模型
API的用户是程序员
API的用户是程序员,并且API的设计会改变使用API的程序员的思维方式。
API的表达力,可编程能力
一组好的API应该考虑它们被使用时的表达力和编程能力:provides for combining simple ideas to form more complex ideas:
- primitive expressions, which represent the simplest entities the language is concerned with,
- means of combination, by which compound elements are built from simpler ones, and
- means of abstraction, by which compound elements can be named and manipulated as units.
参考资料
- The Little Manual of API Design
- A Coder’s Guide to Writing API Documentation
- Annoyances of API Design
什么是API的更多相关文章
- 干货来袭-整套完整安全的API接口解决方案
在各种手机APP泛滥的现在,背后都有同样泛滥的API接口在支撑,其中鱼龙混杂,直接裸奔的WEB API大量存在,安全性令人堪优 在以前WEB API概念没有很普及的时候,都采用自已定义的接口和结构,对 ...
- 12306官方火车票Api接口
2017,现在已进入春运期间,真的是一票难求,深有体会.各种购票抢票软件应运而生,也有购买加速包提高抢票几率,可以理解为变相的黄牛.对于技术人员,虽然写一个抢票软件还是比较难的,但是还是简单看看123 ...
- 几个有趣的WEB设备API(二)
浏览器和设备之间还有很多有趣的接口, 1.屏幕朝向接口 浏览器有两种方法来监听屏幕朝向,看是横屏还是竖屏. (1)使用css媒体查询的方法 /* 竖屏 */ @media screen and (or ...
- html5 canvas常用api总结(三)--图像变换API
canvas的图像变换api,可以帮助我们更加方便的绘画出一些酷炫的效果,也可以用来制作动画.接下来将总结一下canvas的变换方法,文末有一个例子来更加深刻的了解和利用这几个api. 1.画布旋转a ...
- JavaScript 对数据处理的5个API
JavaScript对数据处理包括向上取整.向下取整.四舍五入.固定精度和固定长度5种方式,分别对应ceil,floor,round,toFixed,toPrecision等5个API,本文将对这5个 ...
- ES5对Array增强的9个API
为了更方便的对Array进行操作,ES5规范在Array的原型上新增了9个方法,分别是forEach.filter.map.reduce.reduceRight.some.every.indexOf ...
- javascript的api设计原则
前言 本篇博文来自一次公司内部的前端分享,从多个方面讨论了在设计接口时遵循的原则,总共包含了七个大块.系卤煮自己总结的一些经验和教训.本篇博文同时也参考了其他一些文章,相关地址会在后面贴出来.很难做到 ...
- 一百元的智能家居——Asp.Net Mvc Api+讯飞语音+Android+Arduino
大半夜的,先说些废话提提神 如今智能家居已经不再停留在概念阶段,高大上的科技公司都已经推出了自己的部分或全套的智能家居解决方案,不过就目前的现状而言,大多还停留在展厅阶段,还没有广泛的推广起来,有人说 ...
- 在一个空ASP.NET Web项目上创建一个ASP.NET Web API 2.0应用
由于ASP.NET Web API具有与ASP.NET MVC类似的编程方式,再加上目前市面上专门介绍ASP.NET Web API 的书籍少之又少(我们看到的相关内容往往是某本介绍ASP.NET M ...
- bootstrap + requireJS+ director+ knockout + web API = 一个时髦的单页程序
也许单页程序(Single Page Application)并不是什么时髦的玩意,像Gmail在很早之前就已经在使用这种模式.通常的说法是它通过避免页面刷新大大提高了网站的响应性,像操作桌面应用程序 ...
随机推荐
- 解析ABP框架中的事务处理和工作单元,ABP事务处理
通用连接和事务管理方法连接和事务管理是使用数据库的应用程序最重要的概念之一.当你开启一个数据库连接,什么时候开始事务,如何释放连接...诸如此类的. 正如大家都知道的,.Net使用连接池(connec ...
- MySql技巧个人笔记
1.数据null时sum的用法 mysql数据库SUM(A+B)不一定等于SUM(A)+SUM(B),当A或B为NULL时,SUM(A+B)=NULL. 2.or改为in 同一字段,将or改写为in( ...
- 安卓+servlet+MySql 查询+插入(汉字乱码解决)
问题: 安卓程序,通过servlet连接MySQL数据库,并实现查询和插入(修改,删除类似). 其中遇到的最大的问题是:汉字乱码问题(查询条件有汉字乱码.servlet的汉字到数据乱码.安卓通过ser ...
- RFID应用范围
RFID应用范围 (1)物流: 物流过程中的货物追踪,信息自动采集,仓储应用,港口应用,邮政,快递 (2)零售: 商品的销售数据实时统计,补货,防盗 (3)制造业: 生产数据的实时监控,质量追踪,自动 ...
- 十五天精通WCF——第九天 高级玩法之自定义Behavior
终于我又看完了二期爱情保卫战,太酸爽了,推荐链接:http://www.iqiyi.com/a_19rrgublqh.html?vfm=2008_aldbd,不多说,谁看谁入迷,下面言归正传, 看看这 ...
- shell脚本切割tomcat的日志文件
鉴于在调试logback和log4j的文件切割一直无法成功,随性用shell写个脚本用来切割tomcat下的日志文件(大家如果有在logback或log4j使用文件切割成功的话,可以留下使用方式,先谢 ...
- x01.Game.Main: 从零开始
一切从零开始,一切皆有可能. 浅墨,90后,<逐梦之旅>深入浅出,堪比大师. 1.安装 DXSDK_June10.exe 或更新版本. 2.运行 vs2012,新建 VC Win32 空项 ...
- ELF Format 笔记(二)—— ELF Header
ilocker:关注 Android 安全(新入行,0基础) QQ: 2597294287 以 32 位的 ELF header 数据结构为例: #define EI_NIDENT 16 typede ...
- .net 操作sftp服务器
因为项目的需要,整理了一段C#操作sftp的方法. 依赖的第三方类库名称为:SharpSSH 1.1.1.13. 代码如下: 1: using System; 2: using System.Coll ...
- 如何把报表放到网页中显示(Web页面与报表简单集成例子)
1.问题描述 现在用户开发的系统基本上趋向于BS架构的浏览器/服务器模式,这些系统可能由不同的语言开发,如HTML.ASP.JSP.PHP等,因此需要将制作好的报表嵌入到这些页面中. FineRepo ...