使用方法链接构建对象的成语叫什么名字?


21

我经常使用一种模式,在该模式下,我使用方法链来设置一个对象,类似于BuilderPrototype模式,但没有在每个方法调用中创建新对象,而是修改了原始对象。

例:

new Menu().withItem("Eggs").withItem("Hash Browns").withStyle("Diner");

只是想知道这种模式是否有名称,以及是否将其视为反模式,因为尽管它可以更流畅地阅读,但它可能导致较长的方法链。


3
流畅的界面取决于样式。如果您正在编写API,请为其提供替代形式。
Oded 2012年

1
有关更多讨论,请看以下问题:programmers.stackexchange.com/questions/69519/…–
埃里克·金

@Oded可以通过仅使每个调用单独的语句来使用这种API,而无需链接,或者您对替代方案有其他想法吗?
加勒特音乐厅

@GarrettHall-当然可以,但是您最终会在menu.withStyle("")没有上下文的情况下打电话。在这种情况下,您需要两个 API。
Oded 2012年

2
@GarrettHall“流利接口”的重点方法链,它的含义像句子一样。从这个意义上讲,长方法链不被认为是不好的。但是,在这里我也同意Oded的观点,最好也以更常规的语法提供相同的功能。这样,开发人员可以选择使用哪种方法。
埃里克·金

Answers:


37

流利的界面

我一直听说这种方法被称为“ 流利接口 ”,这是由域驱动设计领域的Eric Evans 和敏捷宣言组织的 Martin Fowler 创造的。

主要缺点是可读性(某些人喜欢和讨厌),并且在某些情况下可能更难调试,因为整个操作链在逐步执行时可能被视为单个语句。

尽管我本人仅使用过几次该技术,但我当然不认为它是反模式。


4
请注意,支持者非常坚持认为,流畅的界面不仅仅涉及方法链接,尽管通常不清楚该术语还意味着什么。
Kilian Foth 2012年

整个链被视为单个语句是否常见?在我看来,这听起来像是设计不良的调试器问题。
blueberryfields 2012年

我还没有遇到将链视为单个语句的调试器,但是如果您只对链中最后一个链中的一种方法感兴趣,那仍然很麻烦。
vaughandroid 2012年

1
我使用C#工作,.NET调试器使我可以轻松进入各个方法。其他语言,我不太确定。
埃里克·金

1
@KilianFoth正如问题注释中所指出的那样,流利接口中的链接方法应该几乎可以理解为一个句子。有时,这意味着各个方法的名称应与被认为是好的做法的名称不同
Izkata 2012年

5

当链中存在某种流程或可发现性时,像这样的方法链通常称为Fluent接口。另外,您可以认为像jQuery这样的api很大程度上依赖于方法链接而不是“流利的”,因为它对可发现性的重视程度不尽相同-更为方便。

对于您的示例(使用withx,withy),您可以将其视为Builder模式的一种变体,因为您拥有一个专门的类,该类在给定某种状态(方法调用)的情况下知道如何返回正确配置的对象。

如果使用得当,这不是反模式。


什么是可发现性?是否可以通过API的自动完成功能找到所需的方法?
Josiah Yoder

我对jQuery不熟悉。他们的方法链如何仅仅是为了方便而不是为了发现?因为有太多的链接方法,即使使用自动完成功能,它也势不可挡?
Josiah Yoder

3

是否被认为是反模式

绝对不是反模式。jQuery可能是最常用的实现。

因为尽管它可以更流畅地阅读,但它可能导致较长的方法链

是的,可以,但是替代品是什么?您可以使用几乎简单的英语句子结尾,并且api会指导您找到可用的内容和适当的内容。


..您将在1行中获得所需的内容,而不是8-10。如果仅在终端中编写一个衬板,这很好。比10更容易调用1个命令。因为它很流利,并且方法具有描述性名称,所以也更易于阅读。遗憾的是,Python2中的许多功能已无法在Python3 / Python4中完成。
mckenzm

-3

这称为“火车残骸”模式。

(这是一种反模式,并且违反了清洁代码)

“火车残骸”模式违反了得墨meter耳定律


3
这与您链接到的文章中的方法链接不同,此处的示例为a.getB().getC().doSomething()。该示例很糟糕,因为“您的方法可以直接在其自己的字段上调用方法(但不能在字段的字段上)”。在这里,只有一个对象正在创建,并且“您可以玩自己制作的玩具”。
Nic
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.