2008-09-11 54 views
11

说你不是返回一个方法,而是返回对类的引用,即使它没有任何特别的语义意义。在我看来,它会给你更多关于如何调用方法的选项,允许你以流畅的界面风格使用它,并且我不能想到任何缺点,因为你不必做任何事情与返回值(甚至存储它)。返回这个而不是void是否有缺点?

因此,假设您在要更新一个对象,然后返回它的当前值的情况是。的 而不是说

myObj.Update(); 
var val = myObj.GetCurrentValue(); 

,你将能够在两行合并说

var val = myObj.Update().GetCurrentValue(); 

编辑:我问之下突发奇想,回想起来,我同意它可能是不必要的和复杂的,但是我关于返回这个而不是空白的问题的立场。

在一个相关的说明,你们认为有语言的东西包括语法糖新位:)

var val = myObj.Update()<.GetCurrentValue(); 

该运营商将具有优先权的低阶所以myObj.Update(将执行首先,然后在myObj上调用GetCurrentValue(),而不是Update的无效返回。

基本上我想象的操作员会说“呼吁运营商的右手边的方法在左边的第一个有效的对象”。有什么想法吗?

回答

9

我知道在Java中他们实际上正在考虑为无效方法制定这种标准行为。如果你这样做,你不需要额外的语法糖。

我能想到的唯一缺点就是性能。但这很容易衡量。我会在几分钟内将结果送还给你:-)

编辑:

返回一提的是比返回void慢一点..什么惊喜。所以这是唯一的缺点。调用你的函数时会多出几个滴答声。

+0

smalltalk ftw,虽然你不能做好方法链接 – 2011-09-09 13:05:09

2

返回“自”或“这个”的一个共同的模式,有时被称为"method chaining"。至于你提出的语法糖,我不太确定。我不是一个.NET人,但对我来说这似乎不是很有用。

+0

是啊也许不是运营商的想法,但我仍然很好奇,可能会有什么好处返回void – 2008-09-11 17:42:36

2

用于使用此模式的NeXTSTEP Objective-C框架。一旦分布式对象(基本上是远程过程调用)被添加到语言中,它在该框架中被终止 - 返回self的函数必须是同步调用,因为分布式对象系统看到返回类型并假定调用者需要了解该功能的结果。

+0

我可以看到这将是一个问题,虽然它不是限制在说C#或VB码。 – 2008-09-11 17:47:59

+0

那么,它在理论上可能是支持自省的任何语言的问题。 – 2008-09-11 21:37:24

12

我认为作为一般政策,它根本没有意义。以这种方式进行方法链接的是适当定义的接口,但只有在语义上有意义时才适用。

你举的例子是一个最好的一个地方是不恰当的,因为它没有任何语义意义。

同样,您的语法糖是不必要的,适当设计流畅的界面。

流畅的接口或方法链接可以工作得很好,但需要仔细设计。

+0

谢谢。我的确切点。 – GEOCHET 2008-09-11 17:49:46

+0

方法链的一个优点是它可以避免使用定义局部变量,这是一个很好的习惯。 – 2011-08-12 17:02:38

2

我可以看到的唯一缺点是它使API稍微更混乱。假设你有一个通常会返回void的remove()方法的集合对象。现在您想要返回对集合本身的引用。新的签名将如下所示:

public MyCollection remove(Object someElement) 

只看签名,目前还不清楚您是否返回对同一实例的引用。也许MyCollection是不可变的,你正在返回一个新的实例。在某些情况下,像这样,您需要一些外部文档来澄清这一点。我真的很喜欢这个想法,并且我相信在Java7中对所有的无效方法进行改进以返回对'this'的引用有一些讨论,但它最终通过了。

+0

这是真的,但它也可以让你写出精简的代码,如 myCollection.remove(item1).add(item2).swap(item3,item4) – 2008-09-11 18:04:00

3

这不就是“流畅接口” - 就像JQuery使用的那些“流畅接口”一样吗?一个好处是应该是代码可读性(虽然维基百科条目http://en.wikipedia.org/wiki/Fluent_interface提到有些人发现它不可可读)。另一个好处是代码简洁,您不必在7行代码中设置属性,然后在第8行中调用该对象的方法。

Martin Fowler(在这里创造了这个术语 - http://martinfowler.com/bliki/FluentInterface.html)表示,流畅的接口比方法链更多,但是方法链接是流畅接口的常用技术。

编辑: 我是真的回来这里来编辑我的答案,并补充说,没有缺点的任何可测量的方式返回这个,而不是无效的,当我看到乔治的评论指出,我没有忘记,讨论的问题。对不起,最初的“毫无意义”散漫。

0

乍一看它可能看起来不错,但对于一致的接口,您将需要所有方法都返回一个对此的引用(它有自己的问题)。

让说你有两个方法木屐这回这个和GetB其返回另一个对象的类:

然后就可以调用obj.GetA()GetB(),但不obj.GetB()。 GetA(),至少看起来不一致。

使用Pascal(和Visual Basic),可以调用同一对象的多个方法。

with obj 
    .GetA(); 
    .GetB(); 
end with; 

具有此功能的问题是,你可以轻松地编写代码,更难理解比它应该是。另外增加一个新的操作符可能会让它变得更加困难。

相关问题