当前位置: 首页 > news >正文

来自Google资深工程师的API设计最佳实践

来自Google资深工程师Joshua Bloch的分享:API设计最佳实践

为什么API设计如此重要?API是一个公司最重要的资产。

为什么API的设计对程序员如此重要?

API一旦发布,出于兼容性考虑,不能轻易地随心所欲进行修改,比如删除参数。

从API的上帝 - 设计者的视角出发,有助于提高代码质量。

一个优秀的API应该满足下列标准:

易学易用,甚至是自描述的,不需文档也能让新手快速上手。不易造成误解。后续维护者易于理解,满足开闭原则 - 能够很容易进行扩展。

如何设计一个好的API

首先应该从收集需求出发。注意结合API实现的复杂度一起考虑。

作为第一步,首先给出需求规格文档,一页即可:

别指望你的API能让所有人满意。也不要指望发布后,它不会出任何错误——那是不可能的。

API也应该遵循单一职责:如果你发觉很难根据你的API实现的功能给它取个合适的名字,这是一个不好的信号,很多时候说明你的API里面做了太多事情——试着把它们拆成多个API。

信息封装 - 公有类尽量避免暴露公有字段出去,最大化信息隐藏

API命名艺术 - API的名称也是一门语言。

API和文档的关系

合理使用继承和子类,不要滥用里氏替换原则

采用fail fast 策略,尽可能早地抛出错误消息:

API的数据都应该允许使用者通过字符串的方式访问

慎用重载

选用合适的API参数和返回类型

API里的参数顺序也很有讲究

避免冗长的参数列表,参数如果超过3个,使用者就需要通过阅读文档才能消费了。

尽量返回不需要调用者进行异常处理的参数,比如空数组或集合,而不是null

API设计里的和异常处理相关的最佳实践

API重构的最佳实践

API设计和Thread-local相关的最佳实践

要获取更多Jerry的原创文章,请关注公众号"汪子熙":

相关文章:

  • grid布局基本概念
  • 论网站经营对一个企业的重要性
  • 持续交付基金会成立!Jenkins,Spinnaker等为首批捐赠项目
  • luogu P2634 [国家集训队]聪聪可可 点分治
  • link和@import的区别是什么 ?
  • 乞丐版的全栈实践
  • DRF教程1-序列化
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • 一个iOS开发者的Flutter“历险记”
  • 12. 掌握Dart最基础的导包操作
  • 魔鬼存在于细节中:从Redshift迁移到ClickHouse后再无数据丢失
  • [2019.3.20]BZOJ4573 [Zjoi2016]大森林
  • JQuery知识总结之选择器
  • 读书之法,在循序而渐进,熟读而精思。
  • REdis CPU百分百问题分析
  • 【347天】每日项目总结系列085(2018.01.18)
  • 2017 年终总结 —— 在路上
  • avalon2.2的VM生成过程
  • Docker下部署自己的LNMP工作环境
  • Git同步原始仓库到Fork仓库中
  • iOS编译提示和导航提示
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • php的插入排序,通过双层for循环
  • python_bomb----数据类型总结
  • scala基础语法(二)
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • spring cloud gateway 源码解析(4)跨域问题处理
  • 搭建gitbook 和 访问权限认证
  • 力扣(LeetCode)21
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • puppet连载22:define用法
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • ​queue --- 一个同步的队列类​
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • # 数据结构
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (2)STL算法之元素计数
  • (AngularJS)Angular 控制器之间通信初探
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (规划)24届春招和25届暑假实习路线准备规划
  • (六)软件测试分工
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (一)认识微服务
  • (转)关于pipe()的详细解析
  • (转载)利用webkit抓取动态网页和链接
  • .NET 4.0中的泛型协变和反变
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .NET 反射的使用