我想知道方法链和流畅接口之间的确切区别。 据我了解,方法链只是运行先前方法返回对象的方法,同时避免临时变量。 这方面的一个例子可能是
Integer.parseInt(str).intValue()
相对于Fluent Interface,对象的每个方法都通过一个点链接起来,不必与前一个方法相关 这两种技术使修饰符方法返回到宿主对象,以便可以在单个表达式中调用多个修饰符,如下所示:
new Car().StartsEngine().OpenWindow()
这是正确的吗?
我不认为有什么重大区别;或者更确切地说,这两个概念处于不同的层面。方法链接很简单,您可以直接在不同方法的返回值上调用一个方法。
流畅的界面是一种设计 API 的风格,用于执行多步骤、复杂的操作,使其读起来接近散文。流畅的接口意味着通过方法链接来使用。它可以为每次调用使用相同的可变对象,也可以每次返回一个新的不可变对象,具体取决于接口作者认为是个好主意。
通过方法链可以实现Fluent接口,但并不是所有的方法链都是Fluent接口。 在 Fluent 接口中,方法链接始终返回所有链接方法使用的相同接口。例如:
public interface Car
{
Car StartEngine();
Car OpenWindows();
Car CloseWindows();
Car startAC();
}
现在 Fluent 接口是通过链接实现的,如下所示:
Car hondaCity = new HondaCity();
hondaCity.startEngine().openWindows().closeWindows().startAC();
现在简单的方法链接示例:
Car hondaCity = new HondaCity();
hondaCity.getEngine(). //Get Engine Object
getFilter(). // get Filter Object
cleanFilter();
在我看来,如果我们忽略类型系统,流畅的接口与方法链完全相同。
然而,流畅的接口更多的是利用返回类型上的类型系统来限制下一个潜在的候选链接方法。
在具有流畅接口的巧妙设计的 DSL 中,每个方法调用都会修改返回类型,以便允许接下来链接一小组逻辑上适当的方法(有点像状态机)。因此,控制流在编译时得到验证。
术语“流畅的界面”是由 Martin Fowler 和 Eric Evans 创造的。福勒说,
关于这种风格,最需要注意的事情可能是其意图是沿着内部领域特定语言的路线做一些事情。事实上,这就是为什么我们选择“流利”这个词来描述它,在很多方面这两个术语是同义词。 ... 我还注意到一个常见的误解 - 许多人似乎将流畅的接口与方法链接等同起来。当然,链接是一种用于流畅界面的常用技术,但真正的流畅性远不止于此。
Fowler 在讨论 DSL 时也引用了 Fluent Interfaces。
内部 DSL 也称为嵌入式 DSL 或 Fluent 接口。
因此,为了描述 Fluent Interfaces,Fowler 需要描述(内部)DSL。
对于内部DSL,模糊的
边界DSL 模式是什么是API和什么是DSL。从根本上讲,没有什么区别,内部 DSL 只是一个具有奇特名称的 API...但是,尽管如此,我认为当您使用用 DSL 编写的 API 时会有不同的感觉。像 Fluent Interface 这样的东西可以使使用 API 成为一种截然不同的体验。用 DSL 术语思考会让你以不同的方式思考可读性......
根据我自己的经验,流畅的接口总是采用方法链;但这只是众多
中的一种。此外,我想我们都见过有损可读性的方法链;所以调用链不会自动流畅。 我想说主要区别是
语法与语义方法链接纯粹是语法上的。这就是编译器关心的。