假设不是返回 void 方法,而是返回对该类的引用,即使它没有任何特定的语义意义。在我看来,它会给你更多关于如何调用方法的选择,允许你以类似流畅界面的风格使用它,而且我真的想不出任何缺点,因为你不需要做任何事情与返回值(甚至存储它)。

因此,假设您想要更新一个对象,然后返回其当前值。而不是说

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

你可以将这两行结合起来说

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

编辑: 我一时兴起问了下面的问题,回想起来,我同意这可能是不必要的且复杂的,但是我关于返回这个而不是无效的问题仍然成立。

与此相关的是,你们认为让该语言包含一些新的语法糖怎么样:

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

该运算符的优先级较低,因此 myObj.Update() 将首先执行,然后对 myObj 调用 GetCurrentValue(),而不是 Update 的 void 返回。

本质上,我想象一个运算符会说“在左侧第一个有效对象上调用运算符右侧的方法”。有什么想法吗?

有帮助吗?

解决方案

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

我能想到的唯一缺点是性能。但这很容易测量。我会在几分钟内回复您结果:-)

编辑:

返回引用比返回 void 慢一点..真是一个惊喜。所以这是唯一的缺点。调用函数时再打几下。

其他提示

我认为作为一般政策,它根本没有意义。这种方式的方法链接可以与正确定义的接口一起使用,但只有在具有语义意义时才是合适的。

你的例子是一个不合适的主要例子,因为它没有语义意义。

同样,对于一个正确设计的流畅界面来说,你的语法糖是不必要的。

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

这难道不是“流畅的接口”——就像 JQuery 使用的接口——是如何构建的吗?一个好处应该是代码可读性(尽管维基百科条目位于 http://en.wikipedia.org/wiki/Fluent_interface 提到有些人找到了它 不是 可读)。另一个好处是代码简洁,您无需在 7 行代码中设置属性,然后在第 8 行中调用该对象的方法。

马丁·福勒(Martin Fowler)(他在这里创造了这个词 - http://martinfowler.com/bliki/FluentInterface.html)说流畅的接口比方法链接有更多的内容,但是方法链接是与流畅的接口一起使用的常见技术。

编辑:我实际上是回到这里编辑我的答案并补充说,当我看到乔治的评论指出我确实忘记讨论 观点 的问题。很抱歉最初的“毫无意义”的胡言乱语。

返回“self”或“this”是一种常见模式,有时称为 “方法链”. 。至于你提出的语法糖,我不太确定。我不是 .NET 人,但它对我来说似乎并不是很有用。

NeXTSTEP Objective-C 框架曾经使用过这种模式。一旦分布式对象(基本上是远程过程调用)被添加到语言中(返回的函数),它就在该框架中停止使用 self 必须是同步调用,因为分布式对象系统看到返回类型并假设调用者需要知道函数的结果。

我看到的唯一缺点是它使 API 变得更加混乱。假设您有一些带有remove() 方法的集合对象,该方法通常会返回void。现在您想要返回对集合本身的引用。新签名如下所示:

public MyCollection remove(Object someElement)

仅查看签名,并不清楚您是否返回对同一实例的引用。也许 MyCollection 是不可变的,并且您正在返回一个新实例。在某些情况下,就像这里一样,您需要一些外部文档来澄清这一点。

我实际上很喜欢这个想法,并且我相信有人讨论过改造 Java7 中的所有 void 方法以返回对“this”的引用,但最终失败了。

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

假设您有一个类,它有两个方法 GetA(返回 this)和 GetB(返回另一个对象):

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

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

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

此功能的问题在于,您很容易编写出比应有的更难理解的代码。另外添加一个新的操作员可能会让事情变得更加困难。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top