问题 包含方法名称末尾的介词是否遵循或减损了正常的C#API设计?


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

我最近有一位代码审查员指出,我习惯在我的方法结束时加入介词。这是我最近编写的一种方法,作为扩展方法 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设计本身是否随着此策略发展,或者它是否始终存在?


971
2017-11-23 12:55


起源

这是我不会提出的那种垃圾(丘吉尔)> ;-) - smirkingman


答案:


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

例如,它可能是晚于第一个的参数:

array.CopyCountedTo(count, destination);

要回答你关于这是否已经与.NET一起发展的问题,不是没有。

函数名中的介词比Microsoft更广泛(例如Java string.charAt 和 string.indexOf),.NET使用它的时间比LINQ长得多(例如 ArrayList.IndexOf 在.NET 1.0)。


6
2017-11-23 14:31





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


4
2017-11-23 13:07





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

RemoveAt 显然意味着它使用一个位置,而 Remove 很模糊在检查参数之前,您没有发现它的真正含义。

CopyTo 意味着重复和运动,而 Copy 仅仅明显意味着重复。

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

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


2
2017-11-23 14:25





正如你所说,这是主观的,但我喜欢这样做,Linq使用它的事实让我感到震惊,这是微软的一个默认。


1
2017-11-23 13:02



我不认为有人需要获得微软的批准,因为如果他们做了一个程序员世界就会遇到麻烦。我同意,但这绝对是风格问题。 - Mike Cheel
我知道我们不需要Microsoft的批准,但他们会编写所有的.Net库代码,因此默认情况下会提供我们都会接触到的标准。他们已经开始在新代码(LINQ)中使用这种表示法意味着他们认为这是合理的事情。 - Jackson Pope