当前位置: 首页 > 面试题库 >

方法链接-为什么这是一个好习惯?

强保臣
2023-03-14
问题内容

方法链接 是对象方法返回对象本身以使结果被另一个方法调用的实践。像这样:

participant.addSchedule(events[1]).addSchedule(events[2]).setStatus('attending').save()

这似乎被认为是一种好习惯,因为它会产生可读的代码或“流畅的界面”。但是,对我而言,它似乎打破了面向对象本身所隐含的对象调用表示法-生成的代码不代表对先前方法的结果执行的动作,通常这是面向对象的代码的工作方式:

participant.getSchedule('monday').saveTo('monnday.file')

这种差异设法为“调用结果对象”的点标记创建了两种不同的含义:在链接的上下文中,以上示例将被视为保存参与者对象,即使该示例实际上旨在保存计划表也是如此。 getSchedule接收的对象。

我知道这里的区别在于是否应期望被调用方法返回某些内容(在这种情况下,它将返回被调用对象本身进行链接)。但是,这两种情况与符号本身并没有区别,仅与被调用方法的语义相区别。当不使用方法链接时,我总是可以知道,方法调用是在与上次调用的结果相关的操作上进行的-通过链接,这种假设会中断,并且我必须在语义上处理整个链,以了解实际对象是什么叫真的是。例如:

participant.attend(event).setNotifications('silent').getSocialStream('twitter').postStatus('Joining '+event.name).follow(event.getSocialId('twitter'))

那里的最后两个方法调用引用了getSocialStream的结果,而之前的方法调用引用了参与者。实际在上下文发生变化的地方写链可能不是一个好习惯(是吗?),但是即使如此,您也必须不断检查看起来相似的点链实际上是否在同一个上下文中,或者仅在结果上起作用。

在我看来,虽然表面上的方法链接确实会产生可读的代码,但是点符号含义的重载只会导致更多的混乱。由于我不认为自己是编程专家,所以我认为这是我的错。所以:我想念什么?我是否理解方法链接有些错误?在某些情况下方法链接特别好,还是在某些情况下特别不好?

旁注:我理解这个问题可以理解为掩盖为问题的意见陈述。但是,它不是-我真正地想理解为什么链被认为是一种好习惯,而在认为链打破了固有的面向对象表示法的地方我犯了错。


问题答案:

我同意这是主观的。在大多数情况下,我避免使用方法链接,但是最近我还发现了一种情况,那就是正确的做法-我有一个方法可以接受10个参数之类的参数,并且需要更多的参数,但是在大多数情况下,您只需要指定一个很少。有了覆盖,这很快就变得非常麻烦。相反,我选择了链接方法:

MyObject.Start()
    .SpecifySomeParameter(asdasd)
    .SpecifySomeOtherParameter(asdasd)
    .Execute();

方法链接方法是可选的,但是它使编写代码更容易(尤其是使用IntelliSense)。请注意,这只是一个孤立的案例,并不是我的代码中的常规做法。

关键是-在99%的情况下,无需方法链接就可以做得甚至更好。但这是1%的最佳方法。



 类似资料:
  • 问题内容: 我正在浏览我最喜欢的网站的html … ahem …,并且在标记中看到了这一点: “?d = 20090107”做什么?我假设它是某种日期,但是我不确定为什么它在文件路径中。有任何想法吗? 问题答案: 这样做是为了给文件名添加一些唯一性,以便当他们更改CSS文件时,他们可以更改额外的位,以完全确保每个客户端都将重新加载CSS,而不是使用缓存版本。 网络服务器将忽略该参数,并正常服务/C

  • 问题内容: 我的建筑师总是说 永远不要同步布尔值 我无法理解原因,如果有人可以举例说明为什么这不是一个好习惯,我将不胜感激。 参考样本代码 问题答案: 我不明白为什么我们应该“从不同步布尔值” 你应该始终synchronize在一个常量对象实例上。如果你在分配的任何对象上进行同步(即,将对象更改为新对象),则该对象不是恒定的,并且不同的线程将在不同的对象实例上进行同步。由于它们在不同的对象实例上进

  • 问题内容: 在1990年代,有一种将Javascript代码直接放入href属性的方式,如下所示: 然后突然我停下来看看。它们全部被替换为: 对于仅用于触发Javascript代码且没有实际目标的链接,为什么鼓励使用该属性而不是该属性? 问题答案: 执行上下文不同,要查看此内容,请尝试以下链接: 通常是在全局上下文中执行,而不是作为元素的方法执行。在大多数情况下,您正在对所操作的元素进行操作或与之

  • 我想知道当您试图捕获StackOverflowError时会发生什么,并提出了以下方法: 现在我的问题是: 为什么这个方法打印'4'? 我想可能是因为在调用堆栈上需要3个段,但我不知道3这个数字来自哪里。当您查看的源代码(和字节码)时,通常会导致比3个多得多的方法调用(因此调用堆栈中的3个段是不够的)。如果这是因为Hotspot VM应用的优化(方法内联),我想知道在另一个VM上结果是否会有所不同

  • 我在一个数据库中有两个表,这两个表都来自最初以电子表格形式提供的官方政府参考表。 下面说明了这两个表的结构。 表1(物种代码) 表2(允许的表示代码) 当我尝试在第一个和第二个之间创建关系时(以便充分利用在第二个表中查找值的能力),当我尝试将speciescodes.FAOC的颂歌链接到alolwestates. Ers物种代码时,会出现以下错误。 “SpeciesCodeLookup”表已成功保

  • 我正在设计一个网站,在导航我有2个链接有下拉菜单(“关于”和“服务”)。当你将鼠标悬停在链接上时,下拉菜单就会出现,然后当你点击链接时,下拉菜单就会消失,然后如果你再点击它,下拉菜单就会再次出现。所以基本上,为了进入那个页面,你必须三次点击链接。有没有人知道我可以做什么来改变这个,这样你就可以在点击一次后进入页面? 这是导航在我的HTML代码中的样子: 以下是相关的CSS: 编辑:我发现下拉菜单是