12

我知道这听起来像是一个主观的答案,但我会尽量使问题尽可能客观,因为对这个问题的客观答案将是最有帮助的。

我最近有一位代码审查员指出我有在方法末尾包含介词的习惯。这是我最近编写的一个方法,作为该类的扩展方法Point

var rectangle = new Rectangle(0, 0, 2, 2);
var point = new Point(3, 1);

var result = point.DistanceTo(rectangle);

我的代码审查员提到该方法应该point.Distance(rectangle). 我一直认为这是主观的和风格的问题。但是,我注意到更多的 .NET API 设计朝着这个方向发展。例如,使用 NUnit 的 Fluent Interface,您可以:

Assert.That(result, Is.EqualTo(1.0));

我在 Linq 上也看到了这一点:

list.CopyTo(anotherList);
list.IndexOf(item);
list.RemoveAt(0);

.NET 和/或第三方 API 设计人员在方法末尾使用介词是否有任何固定或一致的方式?还是只是风格和主观问题?.NET 框架中的 API 设计本身是否随着此策略而发展,还是一直存在?

4

4 回答 4

7

介词很好,只要介词的对象是相应的参数(通常是第一个,而不是this扩展方法的参数)。

一个可能比第一个参数晚的例子:

array.CopyCountedTo(count, destination);

要回答您关于这是否已随 .NET 发展的问题,不,它没有。

函数名称中的介词比 Microsoft 广泛得多(例如 Java 有string.charAtstring.indexOf),而且 .NET 使用它的时间也比 LINQ 长得多(例如ArrayList.IndexOf在 .NET 1.0 中)。

于 2010-11-23T14:31:26.023 回答
4

同意,这是主观的,但我的前提是我不想必须“转到定义”来确定方法调用的作用。这个名字不应该扩展成小说,但描述性肯定不会受到伤害。

于 2010-11-23T13:07:03.240 回答
2

我个人对此的看法是介词增强了方法名称的含义。我永远不会在属性名称中使用它们,因为它们似乎总是暗示一个动作或计算。要使用您从框架中提供的示例:

RemoveAt清楚地暗示它使用一个位置来操作,whileRemove是模糊的;在检查参数之前,您不会发现它的真正含义。

CopyTo意味着重复和移动,而Copy单独只是清楚地意味着重复。

IndexOf告诉我们返回值的含义和方法的参数,而Index只提示返回值。

所以是的,总而言之,我认为它是完全合法的 - 并且 - 提高了代码的可读性和直观性。

于 2010-11-23T14:25:57.793 回答
1

正如您所注意到的,这是主观的,但我喜欢这样做,而 Linq 使用它的事实让我觉得这是微软的默许。

于 2010-11-23T13:02:13.070 回答