设计一个具有级联函数调用的 API( Class.doThis("...").doThat("...")..... )

Posted

技术标签:

【中文标题】设计一个具有级联函数调用的 API( Class.doThis("...").doThat("...")..... )【英文标题】:Design an API with cascade function calls ( Class.doThis("...").doThat("...")..... ) 【发布时间】:2016-05-16 06:21:37 【问题描述】:

我已经看到一些 API 的设计方式是您必须按照以下代码使用它们

Class.doThis("...").doThat("...").....

例如 HTTPCommon (Fluent API) 可以用作:

Request.Get("http://somehost/")
        .connectTimeout(1000)
        .socketTimeout(1000)
        .execute().returnContent().asString();

quartz-schedule 可以用作:

JobDetail job = newJob(HelloJob.class)
               .withIdentity("job1", "group1")
               .build();

SimpleCatptch 可以用作:

Captcha captcha = new Captcha.Builder(200, 50)
                  .addText()
                  .addBackground()
                  .addNoise()
                  .gimp()
                  .addBorder()

这种 API 设计的名称是什么?什么时候这样设计好?

【问题讨论】:

【参考方案1】:

正如 HTTPCommon 所指出的,它被简单地称为“流利的”。构建器拥有流畅的布局很常见,但构建器模式是正交的:Fluent API 是关于可读的链式方法调用,而构建器是关于为对象指定完整的配置,然后一次以完整的状态构建它。

这种风格适用于使代码可读的情况;当 IDE 自动完成可以帮助程序员时,它特别有用。两个最常见的用例是配置(构建器或 Spring 风格的配置器)和数据管道(例如 Java 8 流和反应式编程)。

【讨论】:

【参考方案2】:

您的第一个示例可以称为方法链接。 其他示例有构建器模式、方法链和流畅的接口。

有关问题的第二部分,请参阅What is the difference between a fluent interface and the Builder pattern? 和相关问题。

【讨论】:

【参考方案3】:

这只是一个建造者模式。来自oodesign:

动机

应用程序越复杂,类的复杂性和 使用的对象增加。复杂的物体是由生产的零件组成的 其他在建造时需要特别注意的物体。一个应用程序 可能需要一种用于构建复杂对象的机制 独立于构成对象的那些。如果这是 您遇到的问题,您可能想尝试使用 Builder(或 Adaptive Builder)设计模式。

此模式允许客户端对象通过以下方式构造复杂对象 只指定它的类型和内容,从细节中屏蔽 与对象的表示有关。这样施工 过程可用于创建不同的表示。的逻辑 此过程与创建 复杂的对象,因此可以再次使用该过程来创建不同的对象 对象形成与第一个对象相同的一组简单对象。

基本上,如果您的对象的构建过程有些复杂并且想要公开一种声明性的方式来构建它,您可以使用它。

【讨论】:

以上是关于设计一个具有级联函数调用的 API( Class.doThis("...").doThat("...")..... )的主要内容,如果未能解决你的问题,请参考以下文章

如何设计具有外部阻塞 API 调用的响应式微服务?

如何将一个prop值从一个Class中的函数中获取?

Dynamics CRM 2015/2016/365 Web API:级联查询

反射调用android系统级API函数

Dynamics CRM 2015/2016/365 Web API:级联查询

Mybatis框架学习_7_嵌套属性查询(级联查询)