Effective API Design

*/-->

div.org-src-container {
font-size: 85%;
font-family: monospace;
}

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.
  • 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….

Effective API Design的更多相关文章

  1. API Design

    REST API Design Guidelines V 1.0.201208 Draft 5 Last Updated: 08/31/2012 1       简介 本文档旨在规范REST API的 ...

  2. 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 ...

  3. RESTful API Design With NodeJS & Restify

    http://code.tutsplus.com/tutorials/restful-api-design-with-nodejs-restify--cms-22637 The RESTful API ...

  4. API Design Principles -- QT Project

    [the original link] One of Qt’s most reputed merits is its consistent, easy-to-learn, powerfulAPI. T ...

  5. Atitit.index manager api design 索引管理api设计

    Atitit.index manager api design 索引管理api设计 1. kw 1 1.1. 索引类型 unique,normal,fulltxt 1 1.2. 聚集索引(cluste ...

  6. Atitit.index manager api design 索引管理api设计

    Atitit.index manager api design 索引管理api设计 1. kw1 1.1. 索引类型 unique,normal,fulltxt1 1.2. 聚集索引(clustere ...

  7. 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 ...

  8. Web API design

    Web API design 28 minutes to read Most modern web applications expose APIs that clients can use to i ...

  9. Google API Design Guide (谷歌API设计指南)中文版

    面向资源的设计 这份设计指南的目标是帮助开发人员设计简单.一致.易用的网络API.同时,它也有助于收敛基于socket的API和(注:原文是with,这里翻译为“和”)基于HTTP的REST API. ...

随机推荐

  1. 编程语言教程书该怎么写: 向K&R学习!

    原文地址:Lax Language TutorialsAndrew Binstock 每年在评审Jolt Awards图书的时候,我都会被一些语言教程类图书弄得心力交瘁.从这些年的评审经验来看,这些语 ...

  2. python基础之while语句continue以及break --语法以及案例

    1.while 死循环 [root@localhost python]# cat while.py #!/usr/bin/env python # _*_ coding:utf8 _*_ import ...

  3. 二叉树(前序,中序,后序,层序)遍历递归与循环的python实现

    二叉树的遍历是在面试使比较常见的项目了.对于二叉树的前中后层序遍历,每种遍历都可以递归和循环两种实现方法,且每种遍历的递归实现都比循环实现要简洁.下面做一个小结. 一.中序遍历 前中后序三种遍历方法对 ...

  4. 【转载】14个你可能不知道的 JavaScript 调试技巧

    了解你的工具可以极大的帮助你完成任务.尽管 JavaScript 的调试非常麻烦,但在掌握了技巧 (tricks) 的情况下,你依然可以用尽量少的的时间解决这些错误 (errors) 和问题 (bug ...

  5. asp.net获取当前页面的url地址

    设当前页完整地址是:http://www.jb51.net/aaa/bbb.aspx?id=5&name=kelli "http://"是协议名 "www.jb5 ...

  6. LibreOJ#6030. 「雅礼集训 2017 Day1」矩阵

    https://loj.ac/problem/6030 如果矩阵第i列有一个黑色, 那可以用他把第i行全都染黑,也可以使任意一列具有黑色 然后就可以用第i行把矩阵染黑 染黑一列的代价最少是1 染黑一行 ...

  7. Java并发编程原理与实战四:线程如何中断

    如果你使用过杀毒软件,可能会发现全盘杀毒太耗时间了,这时你如果点击取消杀毒按钮,那么此时你正在中断一个运行的线程. java为我们提供了一种调用interrupt()方法来请求终止线程的方法,下面我们 ...

  8. Python排序算法之直接插入排序

    插入排序的主要思想是每次取一个列表元素与列表中已经排序好的列表段进行比较,然后插入从而得到新的排序好的列表段,最终获得排序好的列表. 比如,待排序列表为[49,38,65,97,76,13,27,49 ...

  9. JavaScript实现单向链表

    JavaScript 本身提供了十分好用的数据类型,以满足大家的日常使用.单靠 Array  和 Object 也的确足够应付日常的绝大部分需求,这也导致了很多前端er对数据结构这一块不是十分的了解. ...

  10. CSS只改变背景透明度,不改变子元素透明度

    一般情况下,我们可以使用css的opcity属性改变某个元素的透明度,但是其元素下的子元素的透明度也会被改变,即使对子元素重新定义也没有用,例如: <div style="opacit ...