什么叫流畅API?

简介: 1.命令查询分离概念流畅API是什么?什么是流畅API?为什么要使用流畅API这种方式?目前很多的编程语言都有方法链串(Method chaining),创造出流畅语义。

1.命令查询分离概念

  • 流畅API是什么?什么是流畅API?为什么要使用流畅API这种方式?
  • 目前很多的编程语言都有方法链串(Method chaining),创造出流畅语义。比较熟悉的就有JQuery,$(‘#id’).css(’color’);而Guava中有如ComparisonChain、Ordering也采用了此风格,这种方法链串的形式就是流畅API的设计思想的表现形式之一。

  • 在探讨流畅API设计之前,得先了解命令查询分离(Command Query Separation)的概念,Martin Fowler的文章〈CommandQuerySeparation〉指出——将类的方法分为命令与查询两类。
  • 改变系统状态但不传回值的方法称为命令,传回结果但不改变系统状态的方法称为查询。

  • 比如说,在JDK中,Calendar类,具备命令查询分离概念,set、add、roll等方法是改变了Calendar实例的方法,返回值都是void,而查询结果的get等方法,并不改变实例状态。Martin Fowler提到采用此原则的好处是,对于一个状态可变的实例来说,可以清楚地辨别哪些操作会有副作用(Side effect)而哪些不会。

  • 你可以将实例传递给需要查询的场合,而不用担心会改变状态和内容;另一个好处是,查询方法的传回型态可标识对象命令操作后的差异性,以Iterator的next方法为例,依命令查询分离思想,将之分开为advance与current方法,会是偏好的设计方式。
  • 命令查询分离概念的优点是方法的职责清楚(后来又演变出CQRS模式)。然而缺点是有时必须透过一连串的命令操作,方可获得想要的物件状态,容易形成冗长的程序,以Calendar类别为例,若想知道1975年5月26日五天后的六个月又三星期是什么日子,在通过Calendar.getInstance()取得Calendar实例后,一段冗长的代码:
calendar.set(1975, Calendar.MAY, 26, 0, 0, 0);
calendar.add(Calendar.DAY_OF_MONTH, 5);
calendar.add(Calendar.MONTH, 6);
calendar.add(Calendar.WEEK_OF_MONTH, 3);

2.方法链串/不可变事物的连续

  • 不可变事物的连续 是比较多见的方式,方法的连续链串就是这样的。命令查询分离在概念上,是将变更实例状态的“命令”与对象状态的“查询”在方法的职责上加以分离。
例如对一个对象的实例A进行操作时,返回值仍然是一个对象B,那就可以直接对传回的对象进行操作,形成链状操作。
Java的字符串是个明显的例子,因为String实例是不可变,进行如下的链结操作:
param.trim()
     .toLowerCase()
     .replace(regx, mask);
  • 这种方法比每执行一个方法操作之后,用一个变量来接收结果,再通过变量进行下一步操作简介。且不违反命令查询分离概念,因为你并没有改变实例状态,而是基于目前实例状态,(也就是查询后)建立新实例。像是同样想知道1975年5月26日五天后的六个月又三星期是什麽日子,利用JSR310可以写为LocalDate.of(1975, 5, 26).plus(5, DAYS).plus(6, MONTHS).plus(3, WEEKS),相较于Calendar的操作简洁许多,代码一目了然。

3.可读性才是是流畅API出发点

  • 流畅的行为可读性是流畅API的出发点。

  • 命令查询分离只是一个概念,方法链串有体现这种思想,又不完全拘泥这种编程思想或者说习惯。代码的流畅可读性是高于此种原则的,将命令与查询方法合并,这种现象在编程语言中并不少见,基于命令查询分离的思想,在jQuery的css方法是命令方法——('#some').css('color', 'red'),也是查询方法——(‘#some’).css(‘color’),在Java中可以用重载(Overload)方法来达到相同目的,以某些程度来说,它就是Getter方法和Setter方法的结合。

  • 总结来说:方法链串是基于命令查询分离思的流畅API常见方式,而不是唯一方式。
  • 流畅API的重点在:大部份设计原则考量的都是职责清晰,降低藕合度,必定优先遵守,基于命令查询分离的概念来说,设计API时应该优先考量这种思想,其次在一些语义明确或惯例的情境下,若有助于可读性则可考虑变通。作为开发人员在类的方法的返回值、名称、型态上,要多下点功夫,一切都以可读性为出发点,API才有流畅的可能性。
相关文章
|
8天前
|
JSON 前端开发 搜索推荐
关于商品详情 API 接口 JSON 格式返回数据解析的示例
本文介绍商品详情API接口返回的JSON数据解析。最外层为`product`对象,包含商品基本信息(如id、name、price)、分类信息(category)、图片(images)、属性(attributes)、用户评价(reviews)、库存(stock)和卖家信息(seller)。每个字段详细描述了商品的不同方面,帮助开发者准确提取和展示数据。具体结构和字段含义需结合实际业务需求和API文档理解。
|
2天前
|
JSON 搜索推荐 API
京东店铺所有商品接口系列(京东 API)
本文介绍如何使用Python调用京东API获取店铺商品信息。前期需搭建Python环境,安装`requests`库并熟悉`json`库的使用。接口采用POST请求,参数包括`app_key`、`method`、`timestamp`、`v`、`sign`和业务参数`360buy_param_json`。通过示例代码展示如何生成签名并发送请求。应用场景涵盖店铺管理、竞品分析、数据统计及商品推荐系统,帮助商家优化运营和提升竞争力。
34 23
|
1天前
|
JSON 缓存 API
解析电商商品详情API接口系列,json数据示例参考
电商商品详情API接口是电商平台的重要组成部分,提供了商品的详细信息,支持用户进行商品浏览和购买决策。通过合理的API设计和优化,可以提升系统性能和用户体验。希望本文的解析和示例能够为开发者提供参考,帮助构建高效、可靠的电商系统。
20 12
|
14天前
|
JSON API 数据格式
京东商品SKU价格接口(Jd.item_get)丨京东API接口指南
京东商品SKU价格接口(Jd.item_get)是京东开放平台提供的API,用于获取商品详细信息及价格。开发者需先注册账号、申请权限并获取密钥,随后通过HTTP请求调用API,传入商品ID等参数,返回JSON格式的商品信息,包括价格、原价等。接口支持GET/POST方式,适用于Python等语言的开发环境。
66 11
|
5天前
|
Web App开发 JSON 测试技术
API测试工具集合:让接口测试更简单高效
在当今软件开发领域,接口测试工具如Postman、Apifox、Swagger等成为确保API正确性、性能和可靠性的关键。Postman全球闻名但高级功能需付费,Apifox则集成了API文档、调试、Mock与自动化测试,简化工作流并提高团队协作效率,特别适合国内用户。Swagger自动生成文档,YApi开源但功能逐渐落后,Insomnia界面简洁却缺乏团队协作支持,Paw仅限Mac系统。综合来看,Apifox是国内用户的理想选择,提供中文界面和免费高效的功能。
|
1月前
|
人工智能 自然语言处理 API
Multimodal Live API:谷歌推出新的 AI 接口,支持多模态交互和低延迟实时互动
谷歌推出的Multimodal Live API是一个支持多模态交互、低延迟实时互动的AI接口,能够处理文本、音频和视频输入,提供自然流畅的对话体验,适用于多种应用场景。
90 3
Multimodal Live API:谷歌推出新的 AI 接口,支持多模态交互和低延迟实时互动
|
25天前
|
JSON 安全 API
淘宝商品详情API接口(item get pro接口概述)
淘宝商品详情API接口旨在帮助开发者获取淘宝商品的详细信息,包括商品标题、描述、价格、库存、销量、评价等。这些信息对于电商企业而言具有极高的价值,可用于商品信息展示、市场分析、价格比较等多种应用场景。
|
5天前
|
API Python
京东拍立淘图片搜索商品接口系列(京东 API)
简介:本文介绍了如何使用拍立淘图片搜索 API 在京东平台上查找相似商品。首先需安装 Python 库 `requests`,并通过内置库 `hashlib` 生成签名。API 支持通过图片 URL 或 Base64 编码的图片进行搜索,返回商品名称、价格等信息。示例代码展示了如何构建请求并处理响应。应用场景包括电商购物助手和竞品分析,帮助用户和商家提高购物效率和市场竞争力。
|
1月前
|
前端开发 API 数据库
Next 编写接口api
Next 编写接口api
110 3
|
1月前
|
XML JSON 缓存
阿里巴巴商品详情数据接口(alibaba.item_get) 丨阿里巴巴 API 实时接口指南
阿里巴巴商品详情数据接口(alibaba.item_get)允许商家通过API获取商品的详细信息,包括标题、描述、价格、销量、评价等。主要参数为商品ID(num_iid),支持多种返回数据格式,如json、xml等,便于开发者根据需求选择。使用前需注册并获得App Key与App Secret,注意遵守使用规范。

热门文章

最新文章