Effective API Design
Effective API Design
*/-->
div.org-src-container {
font-size: 85%;
font-family: monospace;
}
Table of Contents
A well-written API can be a great asset to the organization that wrote it and to all that
use it. Given the importance of good API design, surprisingly little has been written on the
subject. In this talk (recorded at Javapolis), Java library designer Joshua Bloch teaches
how to design good APIs, with many examples of what good and bad APIs look like.
From: Infoq.com
1 Foreword
- Why is API Design Important?
- APIs can be among a company's greates assets.
- Customers invest heavily: buying, writing, learning.
- Cost to stop using an API can be prohibitive
- Successful public APIs capture customers.
- Can also be among company's greatest liabilities
- bad APIs result in unending stream of support calls.
- Public APIs are forever
- One chance to get it right.
- Why is API Design Important to You?
- If you program, you are an API Designer
- Good code is modular - each module has an API
- Usefull modules tend to get reused
- Once module has users, can't change API at will
- You can add new ones,
- But you should not delete or modify existing ones at will.
- Once module has users, can't change API at will
- Thinking in tersm of API improves code quality.
- Characteristics of a Good API
- Easy to learn.
- Easy to use, Hard to misuse
- Easy to read and maintian code that uses it
- Sufficiently powerful to satisfy requirements.
- Easy to extend
- Appropriate to audience.
2 Process of API Design
- Gather requirements - with a Healthy Degree of Skepticism
Often you'll get proposed solutions instead, but better solutions may existing, and your job
is to extract true requirements from the use-cases.And, keep in mind that it can be easier and more rewarding to build somthing more general.
- Make spec short: single page is okey
- Write to Your API Early and Often
- Writing to SPI is Even More Important
- Service Provider Interface (SPI)
- Plugin-in interface enabling multiple implementations
- Example: Java Cryptography Extension (JCE).
- Write multiple plugins before release
- The Rule of threes.
- Maintain Realistic Expectations
3 General Principles
- API should do one thing and do it well
- Functionality should be easy to explain:
- If it's hard to name, that generaty a bad sign.
- Good names drive development.
- Be amenable to spliting and merging modules.
- API should be as mall as possible, but no smaller
- API should satisfy its requirements
- When in doubt, leave it out!
- You can always add, but you can never remove!
- Conceptual weight more important than bulk.
- Look for a good power-to-weight ratio
- Implementation should not impact API
- Minimize Accessibility of Everything
- Make classes and members as private as possible.
- Public classes should have no public fields.
- Maximizes information hiding
- Allow modules to be used, understood, built, tested, and debugged independently.
- Names Matter – API is a Little Language
- Names shoudl be Largely Self-Explanatory
- Be consistent – same word meas same thing
- Be regular – strive for symmetry
- Code should read like prose
- Documentation Matters
- Document Religiosly:
All public APIs should have Documentation:- Classes: what an instance represents
- Method: contract between method and its client
- Preconditions, postconditions, side-effects.
- Parameter: indicat units, form, ownership
- Document state space very carefully
- Consider Performace Consequences of API Design Decisions
- bad decisions can limit performance.
- API Must Coexist Peacefully with Platform
4 Classes Deisgn
- Minimize Mutability
Classes should be immutable unless there's a good reason to do otherwise. If mutable,
keep state-space small, well-defined. - Subcalss only where it makes sense
Subclassing implies subsitituability,- Public classses should not subclasses other public classes.
- Design and Document for Inheritance or Else Prohibit it!
5 Method Design
- Don't make the Client Do Anything the Module Could Do
- Don't Violate Principle of Least Astonishment
- Fail Fast – Report Errors as Sonn as Possible After They Occur
- Provide Programmatic Access to All Data Available in String Form
- Overload With Care
if you must provide ambiguous overloadings, ensure same behavior for same arguments.
- Use Appropriate Parameter and Return Types
- Favor interface types over classes for input.
- Use most specifi possible input parameter type
Moves error from runtime to compile time.
- Don't use string if a better type exists
- Do't use floating point for monetary values:
Binary floating point causes inexact result.
- Use double (64 bits) rather than float(32 bits):
Precision loss is real, performance loss negligible.
- Use Consistent parameter Ordering Across Methods
#include <string.h>
char *strcpy(char *dest, char *src);
void bcopy (void* src, void* dst, int n); // XXX: Bad example!
- Avoid Long Parameter Lists
- Three or fewer parameters is ideal
- Two techniques for shortening parameter lists:
- Break up method
- Create helper class to hold parameters
- Avoid Return Values that Demand Exceptional Processing
6 Exceptions Design
- Throw Exceptions to Indicate Exceptional Conditions
- Don't force client to use exceptions for control flow.
- Don't fail silently
- Favor Unchecked Exceptions
- Include Failure-Capture Information in Exceptions
7 Refactoring API Design
Just some examples….
(转载请注明出处,使用许可:署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议 。)
Effective API Design的更多相关文章
- API Design
REST API Design Guidelines V 1.0.201208 Draft 5 Last Updated: 08/31/2012 1 简介 本文档旨在规范REST API的 ...
- Principles of good RESTful API Design 好的 RESTful API 设计
UPDATE: This post has been expanded upon and converted into an eBook. Good API design is hard! An AP ...
- RESTful API Design With NodeJS & Restify
http://code.tutsplus.com/tutorials/restful-api-design-with-nodejs-restify--cms-22637 The RESTful API ...
- API Design Principles -- QT Project
[the original link] One of Qt’s most reputed merits is its consistent, easy-to-learn, powerfulAPI. T ...
- Atitit.index manager api design 索引管理api设计
Atitit.index manager api design 索引管理api设计 1. kw 1 1.1. 索引类型 unique,normal,fulltxt 1 1.2. 聚集索引(cluste ...
- Atitit.index manager api design 索引管理api设计
Atitit.index manager api design 索引管理api设计 1. kw1 1.1. 索引类型 unique,normal,fulltxt1 1.2. 聚集索引(clustere ...
- RESTful API Design: 13 Best Practices to Make Your Users Happy
RESTful API Design: 13 Best Practices to Make Your Users Happy First step to the RESTful way: make s ...
- Web API design
Web API design 28 minutes to read Most modern web applications expose APIs that clients can use to i ...
- Google API Design Guide (谷歌API设计指南)中文版
面向资源的设计 这份设计指南的目标是帮助开发人员设计简单.一致.易用的网络API.同时,它也有助于收敛基于socket的API和(注:原文是with,这里翻译为“和”)基于HTTP的REST API. ...
随机推荐
- Struts2的配置文件中, <package>的作用,<action><result>重名?
问:Struts2的配置文件中, <package>的作用是什么? 答:防止action重名啊,例如前台和后台,总会有很多地方起名重复的! 问:可是访问的时候,不也是访问action吗,能 ...
- expect详解及自动登录脚本的实现
expect可以让一些交互的任务自动完成,我们可以将一些交互过程写入脚本,ssh登录就是一个简单的实现,下面将介绍expect的用法. 1 安装 yum install -y expect 2 语法介 ...
- VS生成事件执行XCOPY时出现Invalid num of parameters的解决方案
最近想偷懒 想把项目生成的dll全部自动汇集到一个文件夹下 于是乎就动用了VS的生成后事件 在执行Xcopy的时候碰到了点问题 Invalid number of parameters 挺奇怪的,在公 ...
- python3中SSLError错误处理
在deepin中安装了python3.6,安装路径为/usr/local/python36,然后通过deepin自带的python2.7的pip安装了virtualenv: sudo pip inst ...
- group by实现原理及其作用
mysql中group by实现方式有三种,松散索引,紧凑索引,临时文件(文件排序). 在网上看了相关的介绍,大部分介绍都比较晦涩难懂,这里说下我的理解. 在学习SQL优化时,我们都知道可以对grou ...
- python实现域账号登陆
需求:公司的网路比较变态,每天到了24点自动断开,为了避免一台测试机断网,用python做了一个自动登录 原理:时间到了24点的时候,每隔10秒检测是否可以ping通www.baidu.com,如果p ...
- idea 安装lombok 插件过程
一.作用 Lombok是一个可以通过简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 Java 代码的工具,bean,entity等类,绝大部分数据类类中都需要get.set.toStrin ...
- Java并发编程原理与实战三十九:JDK8新增锁StampedLock详解
1.StampedLock是做什么的? ----->它是ReentrantReadWriteLock 的增强版,是为了解决ReentrantReadWriteLock的一些不足. 2.Ree ...
- 36、IO流概述和分类
IO流概述 IO流的主要作用是用来处理设备之间的数据传输,例如可以使用IO流将一台电脑硬盘里面的照片传输到另一台电脑上面,即将照片转换为字节,然后将字节传到另一台电脑上面,另一台电脑接收后,可以将这些 ...
- C. Connect Three(构造)
题目链接:http://codeforces.com/contest/1087/problem/C 题目大意:给你三个点的坐标,让你用尽可能少的方块,让这三个点连起来. 具体思路: 我们先对这三个点进 ...