好的API设计

[非原创,原文链接]

API设计书籍下载:

  1、keynote.pdf  

  2、api-design.pdf

最近在重构公司的一个交互中间件,在重新设计API及总体架构的时候思考了许多, 不禁萌发了一个疑问,什么样的API才算是一个设计良好的API呢?

参考了许多的资料,做一下总结。主要来自这个keynote

什么是API

我们只要是在进行编程我们就需要不停的设计API,

API简单来讲可以是一个调用的函数,一个接口。抽象来说:接口是一个内聚系统暴漏给外部的一切信息。 包含但不限于:

  • 调用方式:比如通过lib库或者http接口等
  • 调用约定:比如lib的函数签名或者HTTP的参数,http method或者头信息,长短链接等等。
  • 依赖关系:比如接口的调用需要涉及到第三方或者其他的准备工作等等。

设计良好API的特点

这里探讨的API均为系统边界的API设计,而对于内部API来说不在探讨范围之内。

变动困难

API就像一个人一样,我们和一个API打交道的时候需要了解这个人的特性偏好等, 有的人很好相处,而有的人让人很头疼,尤其是你不得不和他打交道的时候。

和人一样,如果你不得不和他打交道,要改变他的秉性是很痛苦的,人的“本性难移”, API也一样,一旦发布了,要改变的成本就很大很大。

好的API应该具有:

  1. 易于学习
  2. 即使没有文档也易于使用
  3. 不易误用:这一点很重要,要减少使用者的心智负担
  4. 使用API的代码易于维护。这个有点不一样,不是API本身易于维护,而是API的友好度。 比如接口功能单一,使用简单,使用者的代码也会相应的更易于维护
  5. 易于满足需求:API的完备性和正交性。能够容易的满足需求,完备性保证功能完整, 正交性保证接口的简洁性,不需要为所有的需求提供接口,而是由用户去组合。
  6. 易于扩展

怎么样设计良好的API

基本原则:

  1. 专一:一个API的功能应该是单一的,需要能够很容易的解释和理解,也就会更好用。
  2. 尽可能的小:小有很多的优势,易于理解和维护。
  3. 尽量少的外部依赖:减少使用者的成本
  4. 设计不被实现影响:不要暴漏实现细节给用户
  5. 竟可能少的暴露,不止是内部细节,对于不必要的接口尽量不要发布,比如使用不多的功能, 可以暂时不暴露接口。
  6. 良好的命名:尽量做到自描述。
  7. 完善的文档
  8. 考虑性能

其他具体的方法还是参考后面参考资料的内容吧。

参考资料

  • http://mattgemmell.com/api-design/
  • http://lcsd05.cs.tamu.edu/slides/keynote.pdf 
  • http://ishare.iask.sina.com.cn/f/61717785.html
  • http://qt-project.org/wiki/API-Design-Principles
  • http://www4.in.tum.de/~blanchet/api-design.pdf

转载于:https://www.cnblogs.com/gotodsp/p/3628038.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/421079.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端学习(1035):bootstrap-js插件1

1引入css和js 2复制html 组件 3运行之后得到下拉框

面试之JSP九大内置对象和JSP四大作用域

jsp 九大内置对象和其作用详解 JSP中一共预先定义了9个这样的对象,分别为:request、response、session、application、out、pagecontext、config、page、exception 1、request对象 request 对象是 javax.servlet.httpServletRequest类型的对象。 该对象…

实验5 编写、调试具有多个段的程序

本章实验的主题主要讲代码段、数据段、栈段的使用。 (1) assume cs:code, ds:data, ss:stackdata segmentdw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h data endsstack segmentdw 0, 0, 0, 0, 0, 0, 0, 0 stack endscode segment start:…

[物理学与PDEs]第1章第6节 电磁场的标势与矢势 6.3 例 --- 电偶极辐射

1. 偶极子: 相距为 $l$, 带电量分别为 $\pm q$ 的一对电荷组成的系统. 称 $$\bex {\bf m}q{\bf l} \eex$$ 为电偶极矩, 其中 ${\bf l}$ 为 $-q$ 到 $q$ 的向量. 2. 取 ${\bf l}$ 为 $z$ 轴, 考虑偶极子的振动: $$\bex {\bf l}(t)l_0 e^{-i\omega t} {\bf e}_3. \eex$$ 则 (1) $…

前端学习(1036):bootstrap-js插件2

1大模态框 引入html 自己定义 2说明 就可以显示 js调用 script

实验6 实践课程中的程序

本实验书中已经有源码(158页),稍微改动一下即可。本题中值得学习的地方就是用双重循环遍历二位数组,这在C语言中很简单,但是在汇编中要注意cx的在内外层循环之间的切换情况。 assume cs:codesg, ds:datasg, ss:stacksg…

字符流读取,乱码问题

碰到问题,字符流读取文本文件,读取输出,强转成char出现乱码问题。 题目 用流统计文本文件的字符个数 public static int getSum() {int count 0;BufferedReader br null;try {// 字节流转换为字符流, 设置编码。br new Buffere…

实验7 寻址方式在结构化数据访问总的应用

做本实验时明显感觉寄存器不够用,所以要对bx,si,di,bp的使用仔细阅读,本题比较琐碎,做本题更需要的是耐心,耐心,耐心。 assume cs:codedata segment db 1975,1976,1977,1978,1979,…

Jsp传值方式(乱码问题的解决)

一,Jsp页面的三种传值方式 1,地址栏传值(get提交) 2,a标签传值 (get提交) 3,表单提交 (默认get方式提交) Get/post取中文都会乱码。 Jsp的内置对象request…

生活小感想3

机会永远给有准备的人,不准备永远不会有机会,与其悲天悯人,不如用今天的辛苦换取明天的幸福。 共勉 转载于:https://www.cnblogs.com/luckyflower/p/3633119.html

实验8 分析一个奇怪的程序

仔细阅读9.3节依据位移进行转移的jmp指令,然后理解下面的这个很奇怪的程序就容易多了,当然要看着机器码去分析。 assume cs:codesgcodesg segmentmov ax, 4c00hint 21hstart: mov ax, 0 s: nopnopmov di, offset smov si, offset s2mov ax, cs:[si]mov c…

原来访问网页弹出cookie是这样的

Cookie 是由服务器生成发送给浏览器,浏览器会将Cookie的key/value保存到某个目录下的文本文件内,经过加密的,下次请求同一网站时,就发送该cookie给服务器。以名值对,储存少量信息。 servlet设置cookie Cookie c new C…

[转]android 获取 imei号码

核心代码: Imei ((TelephonyManager) getSystemService(TELEPHONY_SERVICE)) .getDeviceId(); 1.加入权限 在manifest.xml文件中要添加 <uses-permission android:name"android.permission.READ_PHONE_STATE" /> 2.代码 /** * **创建日期 2010-4-29 下午0…

实验9 根据材料编程

本实验关注的重点是如何显示一个二维的数据&#xff0c;很自然是使用二重循环&#xff0c;汇编二重循环也有一个套路&#xff0c;具体看下面的代码&#xff0c;几乎所有的二重循环都是下面这个套路。值得强调的是&#xff0c;两层循环直接进出一定要注意上下文切换&#xff0c;…

用Java和ffmpeg把音频和视频合成视频

借助第三方工具ffmpeg合成视频 需求&#xff1a;在小破站上下载了一些视频&#xff0c;但是放到电脑里面看&#xff0c;我擦&#xff0c;声音文件和视频文件是分开的。 正确安装ffmpeg并配置好环境变量。Java代码测试 转载指明源头 里面是下载的视频和音频 我就上代码递归了…

Android学习笔记:TabHost 和 FragmentTabHost(转)

Android学习笔记&#xff1a;TabHost 和 FragmentTabHost(转) 转自&#xff1a;http://www.cnblogs.com/asion/p/3339313.html 作者&#xff1a;Asion Tang出处&#xff1a;http://asiontang.cnblogs.comTabHost命名空间&#xff1a;android.widget.TabHost初始化函数&#xff…

实验10 编写子程序

1&#xff0c;显示字符串 assume cs:codesg, ds:datasgdatasg segmentdb hello, world, 0 datasg endscodesg segment start: mov dh, 14mov dl, 40mov cl, 2mov ax, datasgmov ds, axmov si, 0 ;si point to datacall show_strmov ax, 4c00hint 21h;-------show_str---------…

企业网站前端制作实战教程 JQuery CSS JS HTML 登录界面

盒子模型 引入重置css样式reset样式 charset "utf-8"; html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, font, img, ins, kbd, q, s, samp, small, strik…

php,Allowed memory size of 8388608 bytes exhausted (tried to allocate 1298358 bytes)

修改apache上传文件大小限制 PHP上传文件大小限制解决方法&#xff1a; 第一&#xff1a; 在php.ini里面查看如下行&#xff1a; upload_max_filesize 8M post_max_size 10M memory_limit 20M 把这些值改成我所说的&#xff0c;看看有没有问题&#xff0c;另外要确认…