gpt4 book ai didi

java - 创建自定义流式 API

转载 作者:行者123 更新时间:2023-12-04 22:43:07 27 4
gpt4 key购买 nike

我将为我的应用程序创建自定义流利的 API。我决定检查现有库的代码,并在至少 2 个使用 fluent api 的项目中发现了一些怪物。

我看到有许多类和接口(interface),它们仅在泛型类型的数量上有所不同。

例如:在 jOOQ 库中 DerivedColumnList22

在 RxJava 中:Action9

这样的怪物有什么目的?它仅适用于性能案例吗?或者是流畅的api有一些共性和方法吗?

当你看到这样的怪物时,在 fluent api 中实现自己的 DSL 看起来很可怕。

最佳答案

既然你提到了jOOQ library ,我在这里给出一个权威的答案,作为 jOOQ 的作者,并且写过这篇关于设计 fluent APIs 的文章(或者更确切地说:用 Java 设计内部领域特定语言):
https://blog.jooq.org/2012/01/05/the-java-fluent-api-designer-crash-course

SomeType22 只是一个名义元组类型

您发现的是 API 设计人员使用元组的共同愿望。一些语言内置了对结构化元组类型的支持,即可以以特别方式创建的元组类型,而不是提前声明它们并给它们命名。后者称为名义类型。 More details about nominal/structural typing here .

具有结构元组类型支持的语言示例:

SQL 是允许创建临时元组类型的语言的一个很好的例子:

SELECT first_name, last_name, age
FROM people

上面的查询创建了一个类型为 (string, string, number) 的 3 级元组表。 . JavaScript 是另一个示例,我可以在其中快速生成这样的元组:

var x = {
firstName: "Lukas",
lastName: "Eder",
age: undefined
};

还有其他语言在某种程度上支持元组。理想情况下,元组允许通过名称和索引访问各个属性。有时,只能通过名称授予访问权限。在其他情况下,它仅由索引给出。但从概念上讲,它总是一样的。
DerivedColumnList22 是什么意思和 Action9
不幸的是,Java 语言没有这样的工具来创建特殊的结构元组类型。 (几乎)Java 中的所有内容都需要在名义上键入。甚至“匿名函数”(lambda 表达式)也需要分配给名义上的 SAM 类型:

    Runnable r = () -> { doSomething(); }
// ^^^^^^^^^^^^^^^^^^^^^^^^ --- Syntactically looks like a structural type
// ^^^^^^^^^^ ------------------------------ But it's really a nominal type

所以,如果一个 API 想要给它的用户一个支持真实结构元组类型的错觉,它必须提前为每个支持的类型提供名称。例如, Action9 :

Action9<T1, T2, T3, T4, T5, T6, T7, T8, T9> action = 
(a, b, c, d, e, f, g, h, i) -> { doSomething(); }
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^ ------------- Look ma! Almost a structural tuple type!

因此,这种技术主要由诸如 RxJava(它鼓励结构元组类型真正发光的函数式编程)或 jOOQ(它鼓励结构元组类型也真正发光的 SQL)之类的库实现。

其他库/API 包括:
  • 斯卡拉的 Tuple1 - Tuple22
  • .NET 的 Tuple1 - Tuple8

  • 这并不意味着您在自己的 DSL 中需要这些类型。从简单开始。最终,您可能会觉得需要添加它们。

    关于java - 创建自定义流式 API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39618652/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com