方法链是一种对象方法返回自身的实践,以便结果可以被用于调用另一个方法。像这样:
participant.addSchedule(events[1]).addSchedule(events[2]).setStatus('attending').save()
这似乎被认为是一种良好的实践,因为它产生了易读的代码,或者称之为"流畅的接口"。然而,对我来说,它似乎打破了面向对象本身暗示的对象调用符号 - 生成的代码不代表对先前方法的结果执行操作,这通常是面向对象代码的预期行为:
participant.getSchedule('monday').saveTo('monnday.file')
这个差异成功地为 "调用结果对象" 的点符号创造了两种不同的含义:在链接上下文中,上面的例子会被解释为保存participant对象,尽管实际上该示例旨在保存由getSchedule收到的schedule对象。
我理解这里的差别在于被调用的方法是否应该返回某些内容(在这种情况下,它将返回用于链接的调用对象本身)。但是,这两种情况无法从符号本身区分出来,只能从所调用方法的语义中区分出来。当不使用方法链时,我总是可以知道方法调用操作与先前调用的结果相关的内容,而使用链接时,这种假设会破裂,我必须从语义上处理整个链以了解正在调用的实际对象。例如:
participant.attend(event).setNotifications('silent').getSocialStream('twitter').postStatus('Joining '+event.name).follow(event.getSocialId('twitter'))
在这里,最后两个方法调用是指 getSocialStream 的结果,而前面的方法调用则是指参与者。也许在实际编写代码时使用上下文更改的链式结构是一个不好的习惯(是吗?),但即使如此,您仍需要不断检查看起来相似的点链是否实际保持在同一上下文中,或者仅适用于结果。
对我来说,方法链表面上确实产生了可读的代码,但是过度使用点号表示法只会导致更多的混淆。由于我并不认为自己是编程大师,因此我假设错误出在我身上。所以:我错过了什么?我是否错误地理解了方法链接?有些情况下链式方法特别好吗?还有一些情况它特别糟糕吗?
附注:我明白这个问题可能被视为掩盖在问题之下的意见声明。然而,这并不是 - 我真诚地想了解为什么链接被认为是良好的实践,并且在哪些方面我的想法有误。
participant.AddSchedule(events[1])
的结果是一个参与者,他刚刚将events[1]
添加到他们的日程表中。 - Adrian McCarthy