【前沿技术】API设计原则

简介: 【前沿技术】API设计原则

1 引言

优秀的 API 之于代码,就如良好内涵对于每个人。好的 API 不但利于使用者理解,开发时也会事半功倍,后期维护更是顺风顺水。

一个骨灰级资深的同事跟我说过,任何在成长的代码库,至少半年到一年就要重构一次,否则失去的不仅是活力,更失去了可维护性与可用性。

2 内容概要

由于本文已经是翻译后的文章,概要只列出不涉及 c++ 概念的思路框架,细节请移步译文

好 API 的 6 个特质

极简且完备、语义清晰简单、符合直觉、易于记忆和引导 API 使用者写出可读代码。

静态多态

尽量减少继承,让相似的类具备相似的 API,而不是统一继承一个父类。因为统一继承会带来 API public 数量过多,父级无意义的方法对用户产生误导。

基于属性的 API

属性指的是对象状态,通过属性为粒度的 API,有利于使用者理解 API 的含义,但需注意关联属性的顺序性。

API 语义和文档

比如传值 -1 的含义是什么?如果 API 文档不像 http status codes 一样健全,建议通过枚举的方式增加可读性。

命名的艺术

不要使用缩写,保持一致性。类命名以功能分组作为后缀,比零散命名更易懂。

函数命名要体现出是否包含副作用,参数过多时以对象作为传参,布尔参数改为枚举类型,或者分解为两个语义化 API。

3 精读

以下精读是对原文观点的补充。

Const 入参

eslint 有一条规则,不要直接改变入参的值。这个规则的初衷是解决函数副作用问题,禁止可能产生副作用代码的产生。但却可以通过如下方式避免:

1. function (num) {
2.   let scopeNum = num
3.   scopeNum = 5
4. }

这是从包含指针类型编程语言学习过来的,因为当 表示指针时,代表代码可能产生副作用(修改入参的风险)。而 js 并不总是这样的,不但没有指针申明,基本类型也总是通过拷贝进入传参,非基本类型通过引用传递,也就是会发生通过如上代码绕过检测,却依然产生副作用(改变函数入参)的情况。*num

为了避免副作用,建议引入 或 ,通过 关键字与约定约束入参行为:flowtypescriptconst

1. function (const num) {
2.   ...
3. }

将没有副作用函数的所有入参定义为 类型,静态检查阶段就禁止了对值的直接修改,同时因为有这个关键字的约束,在函数体内也约定不要通过引用浅拷贝修改它的值。const

但这也无法彻底避免,仍然可以通过如下写法绕过检测,修改入参:

1. function (const num) {
2. const scopeNum = { ...num }
3.   scopeNum.a.b = 'c'
4. }

在 js 中没有完美的方式避免对入参的修改,但通过对入参修饰 关键字,可以对使用者明确这是纯函数,对开发者提示不要写有副作用的代码。const

c++ 的 定义从编译开始就完全杜绝了修改的可能性,虽然有 “去” 行为,但仍然不会改变入参的值(虽然可以后续对值修改,指针指向保持不变,但用 修饰的入参值永远不会改变)。constconst_castconstconst

统一关键字库

所有 api 定义之前,先抽离业务和功能语义的关键字,统一关键字库; 可以更好的让多人协作看起来如出一辙, 而且关键字库 更能够让调用者感觉到 符合直觉、语义清晰; 关键字库也是项目组新同学 PREDO 的内容之一, 很有带入感;

单一职责

接口设计尽量要做到 单一职责,最细粒度化; 可以使用组合的方式把多个解耦的单个接口组合在一起作为一个大的功能项接口; 接口设计的单一职责,也更方便多人协作时候的扩展和组合;

面向未来的多态

对于接口参数的扩展,我们要做到面向扩展开放,面向修改关闭;升级做到要兼容,否则会导致大批量的下游不可用。

同时也要避免过度设计,当抽象功能只有一处使用时,尽量不要过早抽象。

不要重复局部命名

1. class User {
2. // good
3. setName() {}
4. 
5. // bad
6. setUserName() {}

}

在有上下文环境的调用中,减少不必要的描述可以提高 API 的精简和清晰度。

同时要避免过度使用解构,因为解构会丢失上下文,让我们对变量来源一无所知:

1. const { setName } = this.props.store.user
2. const { setVisible } = this.props.store.article

 

上述 脱离了 作用域,当隔着几百行调用时,早已不知所云。setNamesetVisibleuserarticle

4 总结

参考优秀类库是设计 API 很好的方法之一,比如本文 c++ 参考的 Qt、js 可以参考 jQuery。

当 API 稳定后,需要花时间整理文档,因为写文档的思考过程可能推动着你重构和优化代码。

最后,如果有精力,最好每半年重构一次(然后完整跑一遍测试)!

相关文章
|
2月前
|
JSON 缓存 算法
如何通过API获取1688商品类目数据:技术实现指南
1688开放平台提供alibaba.category.get接口,支持获取全量商品类目树。RESTful架构,返回JSON数据,含类目ID、名称、层级等信息。需注册账号、创建应用并授权。请求需签名认证,QPS限10次,建议缓存更新周期≥24小时。
256 2
|
2月前
|
JSON API 数据格式
亚马逊商品评论API接口技术指南
亚马逊商品评论API可程序化获取指定ASIN商品的用户评价,包含评分、内容、时间等结构化数据。需企业认证并遵守使用协议,日调用上限500次。支持分页与排序查询,适用于竞品分析、口碑监测等场景,结合SP-API可构建完整电商数据方案。(238字)
305 3
|
2月前
|
JSON 算法 API
1688比价API接口:实现商品价格高效比较的技术指南
本文介绍1688比价API的核心功能与实战应用,涵盖接口调用、Python代码实现及价格比较算法优化。助您快速集成商品比价功能,提升电商开发效率。
274 3
|
2月前
|
JSON 安全 API
淘宝天猫上货API接口技术指南
本文介绍淘宝天猫上货API,详解其RESTful接口原理、认证流程及Python调用示例。涵盖商品添加、签名生成、响应处理,并提供代码实现与最佳实践,助力开发者高效实现自动化批量上架。
285 3
|
2月前
|
缓存 数据可视化 定位技术
快递鸟快递API技术指南:获取物流轨迹信息与轨迹地图的解决方案
在当今电商竞争激烈的环境中,物流体验已成为提升用户满意度的关键因素。研究表明,超过 75% 的消费者会因物流信息不透明而放弃下单。
469 1
|
2月前
|
JSON 安全 API
1688批量上货API接口技术指南
本文介绍1688批量上货API的集成与使用,涵盖认证、请求构建及错误处理。通过Python示例代码,助您实现商品信息批量上传,提升电商运营效率。
138 1
|
2月前
|
JSON 搜索推荐 API
拼多多商品详情API技术指南
拼多多商品详情API(pdd.goods.detail.get)支持通过商品ID获取商品标题、价格、销量、图片、库存及评价等详细信息,适用于电商数据分析、竞品监控与价格策略优化,返回标准JSON格式,便于集成开发。
|
2月前
|
JSON API 开发者
1688按关键词搜索商品的API接口技术指南
本文介绍如何使用1688开放平台API实现商品关键词搜索,涵盖API概述、权限申请、调用步骤、Python代码示例及注意事项,助力开发者高效集成商品搜索功能,适用于电商自动化、价格监控等场景,内容基于官方文档,确保准确可靠。
244 0
|
2月前
|
存储 缓存 算法
淘宝买家秀 API 深度开发:多模态内容解析与合规推荐技术拆解
本文详解淘宝买家秀接口(taobao.reviews.get)的合规调用、数据标准化与智能推荐全链路方案。涵盖权限申请、多模态数据清洗、情感分析、混合推荐模型及缓存优化,助力开发者提升审核效率60%、商品转化率增长28%,实现UGC数据高效变现。
|
3月前
|
监控 供应链 数据挖掘
探秘1688详情API接口:解锁无限应用场景的技术密钥
1688详情API接口是电商运营的“数据钥匙”,可实时获取商品价格、销量、库存等信息,广泛应用于数据分析、竞品监控、智能选品与自动补货,助力商家提升决策效率与盈利能力,抢占市场先机。
60 0