验证方法的方法名称中的前缀“是”

时间:2009-11-17 17:36:42

标签: naming-conventions

我最近一直在阅读Code Complete,基于这里和朋友的许多参考资料,并为社区提出了一个命名问题。是否应该在确定事件是否成功的布尔方法上使用前缀“Is”?这是我尝试的两种不同命名方案的代码示例:

migrationSuccessful = CopyData();
if (VerifyCopyData())
   migrationSuccessful = CleanupData();

migrationSuccessful = CopyData();
if (IsDataCopied())
   migrationSuccessful = CleanupData();

注意VerifyCopyData和IsDataCopied之间的区别。对我来说,IsDataCopied更有意义,并使代码以更具描述性的模式流动。

感谢您的想法!

编辑:根据一些评论,我想我会澄清IsDataCopied方法的作用。它遍历多个目录和文件,并确保源和目标目录/文件匹配。

11 个答案:

答案 0 :(得分:8)

我同意你的看法。对我来说,IsDataCopied更具可读性。

更一般地说,对我来说,VerifyCopyData是严格的验证方法还是实际上是否有所作为。 IsDataCopied非常清楚它只检查数据是否被复制。

答案 1 :(得分:5)

我同意Matthew Jones的观点,最好将方法命名为IsDataCopied。我想补充一点,当命名与其他代码元素相关的代码元素时,我通常会发现将Is放在名称中而不是在前面更好,因为它在Intellisense中会更接近元素与(并因此更容易找到)有关。例如,在Winforms中,Form具有HandleIsHandleCreated属性。如果IsHandleCreated被命名为HandleIsCreated,它将接近Handle属性并且更容易找到(不会被埋没在Intellisense中)。

答案 2 :(得分:2)

我发现“是”更清楚。名为“VerifyCopyData()”的函数可能在未复制数据时产生异常,或者具有副作用。可能不是,但如果我读它,我不确定该怎么做。一个以Is为前缀的函数是明确的:这个函数没有副作用,只会返回问题的布尔答案。

有一个动词动词(验证)意味着该函数实际上做了某些事情。使用“Is”没有动作动词,因此它暗示该函数仅检查状态而不执行任何其他操作。

答案 3 :(得分:1)

这绝对是主观的,并且,在不同的时间(使用不同的库甚至不同的语言),我都使用这样的前缀并且从不使用它们 - 混合这种惯例而不使用它往往是一个错误。根据上下文确定哪个是最清晰的,包括在该项目/库/等中已经完成的工作。

例如,obj.DataIsCopied()更适合母语为英语的人,但您有!obj.DataIsCopied()(或not)。你必须面对你正在编写代码并需要约定,而这些约定会在主观上增加意义(在描述意义上)。

此外,我希望任何名为Verify的方法都可以进行一些“真实”的工作来验证,而Is应该返回预先计算的/已经可用的值或者通过简单计算它。在您拥有属性的语言中,这更容易表达,因为您可以将“动作”与非动作分开。例如。使用if (obj.data_copied),无论是数据成员还是像IsDataCopied那样的普通函数都被封装。

答案 4 :(得分:1)

IsDataCopied的可读性较低,因为该方法的意图未知。如果它只是返回一个布尔值而没有做任何其他事情,那么它就没问题了。但是,如果它正在执行验证,那么可能会有很多代码隐藏在无辜的条件语句背后。

我的建议:

bool isDataProperlyCopied = VerifyCopiedData();
if ( isDataProperlyCopied ) {
   ...
}

答案 5 :(得分:1)

data.isCopied()

因为英语不是VSO,而是SVO。

答案 6 :(得分:0)

“应该”是一个广义的术语。做对你有意义的事情。在很多情况下,使用“Is”会澄清,但并非总是如此。

再一次,做有意义的事情。

答案 7 :(得分:0)

如果你的方法可以包含一个有助于描述方法功能的动词,那就太好了。 VerifyCopyData听起来像验证数据,而isDataCopied听起来像是在测试某些事实的存在。这是一个微妙的区别。 Nitpick:我会调用第一种方法VerifyCopiedData

答案 8 :(得分:0)

如果它会有任何其他名称我会考虑,但VerifyCopyData肯定不如isDataCopied可读。

答案 9 :(得分:0)

我同意。使用“Is”前缀可以更清楚地知道这是一个布尔函数。它实际上是许多命名约定中的标准,不仅为方法添加前缀,还为属性和变量添加前缀。

验证前缀不是很清楚,因为它很可能是一个无法返回任何内容的void函数或子例程。例如,验证可能意味着它会检查一些事情并在出现问题时抛出异常。如果拥有Is前缀意味着您提出问题,那么将返回答案。

答案 10 :(得分:0)

在涉及变量和属性时,我更喜欢Is

if(o.IsDataCopied)
{
}

但是在这种情况下使用方法调用我会选择像

这样的东西
if(DataIsCopied())
{
}