方法链和流畅接口的区别

3
我希望了解方法链和流畅接口之间的确切区别。 据我所知,方法链只是运行先前方法返回对象的方法,同时避免使用临时变量。 一个例子可以是:
Integer.parseInt(str).intValue()

关于流畅接口,对象的每个方法都由点链接,而不必与之前的方法相关。 这两种技术使修改器方法返回到主机对象,以便可以在单个表达式中调用多个修改器,例如:

new Car().StartsEngine().OpenWindow()

这个正确吗?


1
请查看以下链接中有关Java编程的内容:http://randomthoughtsonjavaprogramming.blogspot.be/2013/10/trainwreck-vs-method-chaining.html。同时,请查阅Martin Fowler文章的参考资料。 - Nico Van Belle
方法链 - 为什么它是一个好的实践,或者不是? - jaco0646
4个回答

5
我认为两者并没有什么大的区别;或者说,这两个概念处于不同的层次。方法链是一种简单的方式,您可以在调用另一个方法返回值的基础上直接调用该方法。
流畅接口是一种设计 API 的风格,用于执行多步、复杂操作,以便使其接近于自然语言。流畅接口将通过方法链来使用。它可以对每个调用使用相同的可变对象,也可以根据界面作者的想法每次返回一个新的不可变对象。

2

流畅接口可以通过方法链实现,但并不是所有的方法链都是流畅接口。 在流畅接口中,方法链始终返回相同的接口,该接口由所有链接方法使用。例如:

public interface Car
{
    Car StartEngine();
    Car OpenWindows();
    Car CloseWindows();
    Car startAC();
}

现在流畅接口是通过链接实现的,如下所示:
Car hondaCity = new HondaCity();
hondaCity.startEngine().openWindows().closeWindows().startAC();

现在是一个简单的方法链示例:

Car hondaCity = new HondaCity();
hondaCity.getEngine(). //Get Engine Object
          getFilter(). // get Filter Object
          cleanFilter();

2
你的意思是并不是所有的方法链都是流畅接口。 - RealSkeptic

2
术语“流畅接口”是由Martin Fowler和Eric Evans创造的。Fowler说:
“关于这种风格,最重要的一点是意图是要做一些类似于内部“特定领域语言”的事情。事实上,这就是为什么我们选择了术语“流畅”来描述它,从很多方面来看,这两个术语是同义词。 ... 我还注意到了一个常见的误解-许多人似乎将流畅接口与方法链式调用等同起来。当然,链式调用是与流畅接口一起使用的常见技术,但真正的流畅性远不止于此。”
Fowler在讨论DSL时也提到了流畅接口。
“内部DSL也被称为嵌入式DSL或流畅接口。”
因此,看起来,为了描述流畅接口,Fowler需要描述(内部)DSL。
对于内部DSL,模糊的边界是API和DSL的区别。从根本上讲,它们没有区别,内部DSL只是一个带有花哨名称的API...然而,尽管如此,我认为使用DSL风格编写的API在使用时会有不同的感觉。像流畅接口这样的东西可以使与API的工作成为一种质的不同的体验。以DSL的方式思考会让你以不同的方式考虑可读性...
根据我的经验,流畅接口总是使用方法链;但这只是众多DSL模式之一。此外,我认为我们都见过降低可读性的方法链;因此,一系列调用并不自动变得流畅。
我认为主要的区别是语法与语义。
方法链仅仅是语法上的。这是编译器关心的。
流畅接口是有意设计用于语义可读性。这是人们关心的。

0
在我看来,如果我们忽略类型系统,流畅接口和方法链式调用是完全一样的。
然而,流畅接口更多地是利用返回类型上的类型系统来约束下一个可能的链式调用方法候选。
在一个巧妙设计的具有流畅接口的领域特定语言中,每个方法调用都会修改返回类型,以便允许一小组逻辑上合适的方法进行下一次链式调用(有点像状态机)。因此,控制流在编译时得到验证。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接