How to Design a Good API
and Why it Matters

What is an API?
Why is API Design Important?
- API 是公司、组织的重要资产
- API 也可能是负担
- 公共 API 一旦发布无法撤回
- 每个开发者都是 API Designer
- 节省开发者时间,提高效率
- 设计 API 的过程是提高代码质量的过程

Wealth?

Love?
Laziness!

Characteristics of a Good API
- Easy to learn
- Easy to use, even without documentation
- Hard to misuse
- Easy to read and maintain code that uses it
- Sufficiently powerful to satisfy requirements
- Easy to extend
- Aimed at its audience
- 即使对事物的内在本质并不清楚,也可以很好地使用它
- 例如:手机、电视、汽车……
- 例如:软件、高级语言、数据库……
- 不同层次的理解:用户、维修人员、开发者、架构师、设计师……
Cluelessness 无绪
操作系统
处理器
主存
IO设备
文件
虚拟存储器
指令集
进程
虚拟机
计算机系统提供的一些抽象
- 航母设计师不需要了解一颗螺丝钉如何制造
- 找到一种编程实践方法,让开发者不需要了解所有事情
- API 是对所需知识的抽象,它将系统的复杂性隐藏起来
选择性无绪
所有设计原则都围绕着 “隐藏复杂性” 这一根本目标
- 收集需求,带着质疑
- “他的问题是什么”而不是“他要什么”
- onFirstComponentOfTheSecondPageVisible(callback) => onPageVisible(pageNumber, callback)
- “提供全景图下载功能” => “让全景图能离线播放”
- 对问题抽象,创建用例:API 要解决什么问题
- 更抽象的问题可能更容易解决,收益也更大
- “他的问题是什么”而不是“他要什么”
The Process of API Design
- 简短的 API spec
- 敏捷比完整更重要,易于修改
- 找更多人讨论,听取意见(需求方、senior engineers……)
- 做好决定后不断填充细节
- 尽早动手写原型代码:核心用例,尽早发现问题
- 保持合理预期
- 满足所有人的需求 => do one thing and do it well
- 完美的设计 => 为修改留出余地
The Process of API Design
- API Should Do One Thing and Do it Well
- 如果某个 API 很难命名,很可能抽象不好
- 灵活地拆分合并模块
- API Should Be As Small As Possible
- 首先要满足需求
- 如果不确定是否需要这个 API,先不要
- 概念的多少比 API 的多少更重要
General Principles

webpack:概念、接口、用法都多
Text
Text

Redux:接口少,概念多
Text

jQuery & Lodash:接口多,概念少


gulp:接口少,概念也少
- Implementation Should Not Impact API
- API 不应该暴露出内部实现
- 增加使用者负担
- 给未来的修改造成困难
- API 不应该暴露出内部实现
- Minimize Accessibility of Everything
- 让类、方法、成员、函数尽可能私有、局部
- 尽可能地隐藏信息
- 尽量让模块能够被独立地理解、使用、测试
General Principles

calculateNewPosition(event: MouseEvent) {
return {
x: event.clientX + 100,
y: event.clientY + 50
};
}
calculateNewPosition(position: Vector2) {
return {
x: position.x + 100,
y: position.y + 50
};
}CSS
- Similar things should look similar
- 概念、代码风格保持一致
- 尽量遵循所在平台约定俗成的概念和规则
- 大多数时候 API 应该是对称的
- Be opinionated
- 既可以这样又可以那样时,要有明确的规范
- 代码风格、概念要清晰,一致
General Principles

$.each V.S. $.map


Vue Component Lifecycle APIs

Node.js Callback Style
- Minimize Mutability
- Subclass Only Where It Makes Sense
- Avoid ambiguous overloadings
- User of API should not be surprised by behavior
- Report Errors as Soon as Possible After They Occur
- Use Appropriate Parameter and Return Types
Implementation Principles
- API 的目的是隐藏复杂性,围绕这一目标,总结出了上述原则
- 都是编程中基本原则的应用:
- S.O.L.I.D
- Least Knowledge
Summary

How to Design a Good API and Why it Matters
By yiliang_wang
How to Design a Good API and Why it Matters
- 229