API设计原则:正确、好名、易用、易学、够快、够小。但我们从来不缺原则,〜〜〜
Interface
1.The Importance of Being Use Case Oriented,一个接口应当是一组方法的集合,方法是否能放在一起、最重要的依据是通过用测和使用场景去判断。更具体地是The Input Params Oriented,输入参数一定与接口相关。
2.you can't know what users of your API will do with it.但了解接口的可能调用者情况,预测使用场景,考虑性能压力。使用场景包括:WHO、WHY、WHERE、WHEN、HOW等,e.g.[APP团购单详情页][为了获取商户详情][在团购列表页][当该用户未购买过该团购单时][通过传Enum.Type.Mobile&shopId方式]调用shpinfo.bin接口。性能压力,各渠道调用QPS等。另外还需考虑线程安全,如synchronized等。
3.版本控制。 bring out one or more 0.x versions. create a new API with different package names. 不稳定版本、采用小号方式,让用户知道”我是坏人“。如果历史包袱太重,那就干脆换个包,令新、旧API和谐共存。另外,你永远都可以新增API,但永远都不能删除。
4.考虑提供批量处理方法,批处理可以有效减少网络传输、增加处理效率等。应当在批处理之前定义单个操作。
5.接口应该保证幂等性,异步调用超时、可保证重复调用,如AddConsum(serialNo, user, product, money),增加serialNo避免重复提交。
6.屏蔽底层实现细节。不要过度地具体说明方法的行为,如:用Map、List替换HashMap、ArrayList等,Exceptions should usually be unchecked。
Class
7.接口类使用到的所有实体类/Bean等类,为之提供无参数的构造函数。 一些框架如hessian需要bean有无参的构造函数。
8.接口方法中避免重载的方法,即避免有两个方法同名,重载的方法一个方面在hessian接口调用会有问题(其他协议的远程接口可能也有问题),另一个方面同名的方法影响代码可读性。 比如这样的接口是不合适的。
9.接口中用到的自定义类, 实现序列化接口,提供toString()方法; Java要提供toString()方法,并继承Serializable接口,生成Serial Verion UID。考虑实现Comparable等接口。
10.禁止使用继承,在实现类前加final关键字。继承违反了encapsulation特性,子类必须知道父类的实现特性。
Method
11.采用合适的参数和返回数据类型。如:使用BigDecimal或double代替float(32bit),使用更加灵活的接口数据类型作为输入参数,尽量使用Enum代替String作为类型区分参数等。
12.避免过长的参数列表,专家建议不超过3个,欢迎拍砖。有两种技术避免过长参数:a.将一个多个步聚的方法拆分细化,b.创建包含这些参数的帮助类。
13.避免集合返回NULL,应当返回空对象。但对于单个对象,如果空对象不能够方便地表达“值为NULL”的状态,则返回NULL。
附:
(转)Java API设计清单
转自: 伯乐在线 Java API设计清单 英文原文 TheAmiableAPI 在设计Java API的时候总是有很多不同的规范和考量.与任何复杂的事物一样,这项工作往往就是在考验我们思考的缜密程度 ...
在Java API设计中,面向接口编程的思想,以及接口和工厂的关系
现在的java API的设计中,提倡面向接口的编程,即在API的设计中,参数的传递和返回建议使用接口,而不是具体的实现类,如一个方法的输入参数类型应该使用Map接口,而不是HashMap或Hashta ...
Java API设计原则清单
在设计Java API的时候总是有很多不同的规范和考量.与任何复杂的事物一样,这项工作往往就是在考验我们思考的缜密程度.就像飞行员起飞前的检查清单,这张清单将帮助软件设计者在设计Java API的过程 ...
paip.web数据绑定 下拉框的api设计 选择框 uapi python .net java swing jsf总结
paip.web数据绑定 下拉框的api设计 选择框 uapi python .net java swing jsf总结 ====总结: 数据绑定下拉框,Uapi 1.最好的是默认绑定..Map(k ...
Atitit. 二进制数据ascii表示法,与base64编码解码api 设计标准化总结java php c#.net
Atitit. 二进制数据ascii表示法,与base64编码解码api 设计标准化总结java php c#.net 1. Base64编码, 1 1.1. 子模式 urlsafe Or url ...
RESTful API 设计最佳实践
背景 目前互联网上充斥着大量的关于RESTful API(为了方便,以后API和RESTful API 一个意思)如何设计的文章,然而却没有一个"万能"的设计标准:如何鉴权?API ...
RESTful API 设计指南 (转)
RESTful API 设计指南 2016-02-23 ImportNew (点击上方公号,可快速关注) 作者:阮一峰 链接:http://www.ruanyifeng.com/blog/2014/0 ...
优秀API设计的十大原则
优秀API设计的十大原则 2015-09-23 分类:编程开发.设计模式.首页精华暂无人评论 分享到:更多4 二十万年薪PHP工程师培养计划 成为被疯抢的Android牛人 风中叶讲Java重难 ...
随机推荐
JSONP实现跨域
首先提出:什么是跨域?如何解决跨域? 跨域可以简单的理解为从一个域名访问另一个域名,由于javascript的同源政策的限制,出于安全的考虑,不允许浏览器这么做.比如a.com 域名下的js无法操作b ...
.Net工程详解及项目版本管理
前言 写这篇文章的目地是为了让更多的小伙伴对VS生成的工程有一个清晰的认识.在开发过程中,为了赶进度,并不是每个人都有学习的时间. 但如果上层项目管理人员对这些工程目录不熟悉的话,把VS编译的中间文件 ...
[Android Pro] 监听内容提供者ContentProvider的数据变化
转载自:http://blog.csdn.net/woshixuye/article/details/8281385 一.提出需求 有A,B,C三个应用,B中的数据需要被共享,所以B中定义了内容提供者 ...
Linq to Sql 总生成 where ID is null 的解决办法
using (Entities com = new Entities()){ com.Configuration.UseDatabaseNullSemantics = true; } EF+M ...
首页重定位到mian.action上
Python学习记录----语法学习
一控制语句 http://blog.csdn.net/lynn_yan/article/details/5464911 if 语句 二 字典详解 http://blog.csdn.net/moodyt ...
[Codeforces 864E]Fire
Description Polycarp is in really serious trouble — his house is on fire! It's time to save the most ...
vim汇总
跳到100行 100gg :100
Golang 类型转换,断言和显式强制转换
1 前言 类型转换,可以用断言(只能使用在interface{}类型转换成其它类型)和显式类型强制转换(常规是用于基本类型) 2 代码 //graphql-go func(params graphql ...
01day
01 cpu 内存 硬盘 操作系统 CPU:中央处理器,相当于人大脑. (运行速度飞机) 内存:临时存储数据. 8g,16g, (高铁) 1,成本高. 2,断电即消 ...