【前沿技术】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 稳定后,需要花时间整理文档,因为写文档的思考过程可能推动着你重构和优化代码。

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

相关文章
|
12天前
|
存储 API 开发者
深入理解RESTful API设计原则
本文探讨了RESTful API的设计原则,强调了其在现代Web服务中的重要性。通过分析状态表示转移(REST)的概念、核心约束以及最佳实践,本文旨在为开发者提供构建高效、可扩展和易于维护的API的指导。文章还讨论了常见的设计陷阱和如何避免它们,以确保API设计的健壮性和灵活性。
|
17天前
|
存储 安全 API
深入理解RESTful API设计原则
本文旨在探讨RESTful API设计的基本原则和最佳实践,帮助开发者构建高效、可维护的Web服务。通过分析REST架构的核心概念,如资源、统一接口、无状态通信等,本文将指导读者如何设计符合REST原则的API,以及如何处理常见的设计挑战,如版本控制、错误处理和安全性问题。
|
19天前
|
存储 缓存 API
深入理解RESTful API设计原则
【10月更文挑战第28天】 在现代软件开发中,RESTful API已经成为了前后端分离架构下不可或缺的一部分。本文将探讨RESTful API的核心设计原则,包括资源导向、无状态性、统一的接口以及可缓存性等关键概念,并通过实例解析如何在实际应用中遵循这些原则来设计高效、可扩展的API。我们将深入了解REST架构风格的理论基础,并讨论其对提升系统互操作性和简化客户端实现的重要性。
53 3
|
21天前
|
XML API 网络架构
深入理解RESTful API设计原则与实践
【10月更文挑战第26天】在数字化浪潮中,API(应用程序编程接口)成为连接不同软件组件的桥梁。本文将深入浅出地探讨如何根据REST(Representational State Transfer)原则设计高效、易于维护和扩展的API,同时分享一些实用的代码示例,帮助开发者构建更加健壮和用户友好的服务。
|
28天前
|
安全 物联网 API
API技术之身份认证
【10月更文挑战第17天】身份认证是API安全的核心,确保API可信可控。
API技术之身份认证
|
10天前
|
缓存 前端开发 API
探索后端开发中的API设计原则
【10月更文挑战第37天】本文旨在引导读者理解API设计的核心理念,通过简明的语言和直观的示例,揭示如何构建高效、稳定且易于维护的后端接口。我们将深入浅出地探讨RESTful API的设计规范,并通过一个简易的代码样例,展示如何在实战中应用这些原则。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的参考和启示。
|
1月前
|
JSON 前端开发 测试技术
API接口 |产品经理一定要懂的10%技术知识
作为产品经理,掌握约10%的技术知识对处理API相关工作至关重要。这包括理解API的基本概念及其作为数据交换的桥梁作用;熟悉JSON和XML两种主要数据格式及其特点;了解常见HTTP请求方法(GET、POST、PUT、DELETE)及响应状态码;关注API安全性,如认证授权和数据加密;掌握API版本管理和错误处理技巧;重视性能优化,以提升用户体验;参与API联调测试,确保稳定可靠;并与前后端团队紧密协作,选择合适的第三方API服务,推动产品高效开发。
|
1月前
|
安全 测试技术 API
后端开发中的API设计原则与最佳实践
本文将深入探讨在后端开发中API(应用程序编程接口)设计的基本原则和最佳实践。通过阐述如何构建高效、可扩展且安全的API,帮助开发者提升后端系统的性能和用户体验。不同于传统的摘要,本文无需包含背景介绍,直接进入主题,为读者提供实用的指导。
61 7
|
1月前
|
SQL 缓存 安全
深入理解后端开发中的API设计原则
【9月更文挑战第32天】在数字化浪潮中,API(应用程序编程接口)作为连接不同软件组件的桥梁,其设计质量直接影响着后端系统的效能与扩展性。本文将通过浅显易懂的方式,探讨如何构建高效、安全且易于维护的API,同时提供实用的代码示例,帮助读者在后端开发实践中提升API设计的水平。
45 3
|
1月前
|
XML API 网络架构
API协议 的十种技术特点及适用场景
本文介绍了十种常见的API协议技术,包括REST、GraphQL、gRPC、SOAP、WebSocket、AMF和XML-RPC等,每种技术都有其特点和适用场景,如REST适用于轻量级Web服务开发,gRPC适合高性能分布式系统,而WebSocket则适用于需要低延迟交互的应用。

热门文章

最新文章