方法链接是Martin Fowler的《领域特定语言》一书中介绍的一种技术。方法链接总结为
使修饰符方法返回宿主对象,以便可以在单个表达式中调用多个修饰符。
看这段非链接/常规代码(从上述书籍中移植到PHP)
$hardDrive = new HardDrive; $hardDrive->setCapacity(150); $hardDrive->external(); $hardDrive->setSpeed(7200);
通过方法链接,您可以以更紧凑的方式编写上述语句:
$hardDrive = (new HardDrive) ->setCapacity(150) ->external() ->setSpeed(7200);
为此,您所需要做的就是使用要链接return $this的方法:
class HardDrive { protected $isExternal = false; protected $capacity = 0; protected $speed = 0; public function external($isExternal = true) { $this->isExternal = $isExternal; return $this; // 返回当前的类实例以允许方法链接 } public function setCapacity($capacity) { $this->capacity = $capacity; return $this; // 返回当前的类实例以允许方法链接 } public function setSpeed($speed) { $this->speed = $speed; return $this; // 返回当前的类实例以允许方法链接 } }
使用方法链接的主要用例是在构建内部领域特定语言时。方法链接是表达式构建器和Fluent接口中的构建块。但是,它不是这些的同义词。方法链接仅启用这些功能。引用福勒:
我还注意到一个常见的误解-许多人似乎将流畅的界面与“方法链”等同。当然,链接是与流利的接口一起使用的常用技术,但是真正的流利性远不止于此。
话虽如此,使用方法链接只是为了避免编写宿主对象,这被许多人视为代码异味。它适用于不明显的API,尤其是在与非链接API混合使用时。
命令查询分离是Bertrand Meyer提出的设计原则。它指出,使状态发生变化的方法(命令)不应返回任何内容,而返回某些状态的方法(查询)不应使状态发生变化。这使得对系统进行推理变得更容易。方法链接违反了这一原理,因为我们正在改变状态并返回某些东西。
在使用实现方法链接的类时,在调用getter方法(即返回除之外的方法的方法)时要特别注意$this。由于getter必须返回除以外的值$this,因此将其他方法链接到getter上会使调用对获得的值进行操作,而不是对原始对象进行操作。尽管有一些链式吸气剂的用例,但它们可能会使代码的可读性降低。
上面介绍的方法链接不违反Demeter法则。它也不会影响测试。那是因为我们返回的是主机实例,而不是协作者。这是一个普遍的误解,源于人们将纯粹的方法链接与Fluent接口和Expression Builders混淆了。仅当方法链接返回除宿主对象以外的其他对象时,您才违反Demeter定律并最终在测试中出现模拟节。
问题内容: 我正在使用PHP 5,并且听说过面向对象方法中的一项新功能,即“方法链接”。究竟是什么?如何实施? 问题答案: 实际上,它相当简单,您有一系列的mutator方法,它们都返回原始(或其他)对象,这样您就可以继续在返回的对象上调用方法。 输出“ ab” 在线尝试!
问题内容: 是否可以使用静态类将静态方法链接在一起?说我想做这样的事情: 。。。并且显然我希望将$ value分配给数字14。这可能吗? 更新 :它不起作用(您不能返回“自我”-它不是实例!),但这就是我的想法带给我的地方: 解决了这些问题之后,我认为仅使用类实例而不是尝试链接静态函数调用(这似乎不太可能,除非可以对上述示例进行一些调整)才有意义。 问题答案: 我喜欢上面Camilo提供的解决方案
问题内容: 在回答前面的一些问题以及最近的工作时,我一直在想为什么Java不支持其内置类中的方法链接。 例如,如果我要创建一个类,可以通过以下方法而不是void来使其 可链接: 内置库为什么不倾向于以这种方式执行操作?方法链接有不利之处吗? 我可能忽略了一些可以解释缺少方法链接的内容,但是任何默认返回void的setter方法都应该返回 对此 的引用(至少在我看来应该如此)。这样可以使以下情况更加
问题内容: 在回答前面的一些问题以及最近的工作时,我一直在想为什么Java不支持其内置类中的方法链接。 例如,如果我要创建一个类,可以通过以下方法而不是void来使其 可链接: 内置库为什么不倾向于以这种方式执行操作?方法链接有不利之处吗? 我可能忽略了一些可以解释缺少方法链接的内容,但是任何默认返回void的setter方法都应该返回 对此 的引用(至少在我看来应该如此)。这样可以使以下情况更加
问题内容: (不要与itertools.chain混淆) 我正在阅读以下内容:http : //en.wikipedia.org/wiki/Method_chaining 我的问题是: 在python中实现方法链接的最佳方法 是 什么? 这是我的尝试: 一个问题是调用是否修改但不返回。(那么我应该退货还是退货)。 有没有人有更好的实现链接的方法?可能有很多方法可以做到这一点。 我是否应该假设某个方
本文向大家介绍php调用新浪短链接API的方法,包括了php调用新浪短链接API的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了php调用新浪短链接API的方法。分享给大家供大家参考。具体方法如下: 本文中短连接已经附带的一个appkey不用再自己申请KEY当然你如果需要使用你自己的您也可以自己去替换。至于用法就看你了,镶入到其他程序使用,单独做个生成短连接的页面都可以。使用方法就不