什么叫流畅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才有流畅的可能性。
相关文章
|
3月前
|
机器人 API Python
智能对话机器人(通义版)会话接口API使用Quick Start
本文主要演示了如何使用python脚本快速调用智能对话机器人API接口,在参数获取的部分给出了具体的获取位置截图,这部分容易出错,第一次使用务必仔细参考接入参数获取的位置。
190 1
|
1天前
|
JSON API 数据格式
店铺所有商品列表接口json数据格式示例(API接口)
当然,以下是一个示例的JSON数据格式,用于表示一个店铺所有商品列表的API接口响应
|
11天前
|
编解码 监控 API
直播源怎么调用api接口
调用直播源的API接口涉及开通服务、添加域名、获取API密钥、调用API接口、生成推流和拉流地址、配置直播源、开始直播、监控管理及停止直播等步骤。不同云服务平台的具体操作略有差异,但整体流程简单易懂。
|
23天前
|
人工智能 自然语言处理 PyTorch
Text2Video Huggingface Pipeline 文生视频接口和文生视频论文API
文生视频是AI领域热点,很多文生视频的大模型都是基于 Huggingface的 diffusers的text to video的pipeline来开发。国内外也有非常多的优秀产品如Runway AI、Pika AI 、可灵King AI、通义千问、智谱的文生视频模型等等。为了方便调用,这篇博客也尝试了使用 PyPI的text2video的python库的Wrapper类进行调用,下面会给大家介绍一下Huggingface Text to Video Pipeline的调用方式以及使用通用的text2video的python库调用方式。
|
1天前
|
JSON 前端开发 JavaScript
API接口商品详情接口数据解析
商品详情接口通常用于提供特定商品的详细信息,这些信息比商品列表接口中的信息更加详细和全面。以下是一个示例的JSON数据格式,用于表示一个商品详情API接口的响应。这个示例假定API返回一个包含商品详细信息的对象。
|
23天前
|
JSON JavaScript API
(API接口系列)商品详情数据封装接口json数据格式分析
在成长的路上,我们都是同行者。这篇关于商品详情API接口的文章,希望能帮助到您。期待与您继续分享更多API接口的知识,请记得关注Anzexi58哦!
|
6天前
|
JSON API 开发者
1688API商品详情接口如何获取
获取 1688 API 商品详情接口的步骤包括:1. 注册开发者账号;2. 了解接口规范和政策;3. 申请 API 权限;4. 获取 API 密钥;5. 实现接口调用(选择开发语言、发送 HTTP 请求);6. 处理响应数据。通过这些步骤,可以顺利调用 1688 的商品详情 API。
|
2月前
|
安全 API 开发者
Web 开发新风尚!Python RESTful API 设计与实现,让你的接口更懂开发者心!
在当前的Web开发中,Python因能构建高效简洁的RESTful API而备受青睐,大大提升了开发效率和用户体验。本文将介绍RESTful API的基本原则及其在Python中的实现方法。以Flask为例,演示了如何通过不同的HTTP方法(如GET、POST、PUT、DELETE)来创建、读取、更新和删除用户信息。此示例还包括了基本的路由设置及操作,为开发者提供了清晰的API交互指南。
100 6
|
3月前
|
存储 JSON API
淘系API接口(解析返回的json数据)商品详情数据解析助力开发者
——在成长的路上,我们都是同行者。这篇关于商品详情API接口的文章,希望能帮助到您。期待与您继续分享更多API接口的知识,请记得关注Anzexi58哦! 淘宝API接口(如淘宝开放平台提供的API)允许开发者获取淘宝商品的各种信息,包括商品详情。然而,需要注意的是,直接访问淘宝的商品数据API通常需要商家身份或开发者权限,并且需要遵循淘宝的API使用协议。
淘系API接口(解析返回的json数据)商品详情数据解析助力开发者
|
20天前
|
监控 API 开发工具
深入理解API设计:构建高效的接口
【10月更文挑战第6天】深入理解API设计:构建高效的接口
56 0