2009-11-17 45 views
6

最近我一直在阅读代码完整,基于许多参考文献和一位朋友,并且有一个社区的命名问题。在确定事件是否成功的布尔方法上应该使用前缀“Is”?下面是我尝试两种不同的命名方案的一个代码示例:验证方法的方法名称中的前缀“是”

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

对:

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

通知VerifyCopyData和IsDataCopied之间的差异。对我来说,IsDataCopied更有意义,并使代码流更具描述性。

感谢您的想法!

编辑:基于一些评论,我想我会澄清什么是IsDataCopied方法。它通过几个目录和文件循环,并确保源目录和目标文件匹配。

+0

只是一个小技巧,确保他们不听起来像测试方法,VerifyObjectIsNotNull,我已经看到了这一点,并导致了一个模糊性 – Perpetualcoder

+0

一般观察...这些问题吸引upvotes .. – sud03r

+6

事实,你必须澄清什么该功能确实应该是你的红旗。 ;) –

回答

5

我与马修·琼斯就是它最好命名方法IsDataCopied同意。我想补充一点,当命名与其他代码元素相关的代码元素时,我通常会发现将Is放在名称内而不是前面会更好,因为它在Intellisense中会更接近与其相关的元素(并因此更容易找到)。例如,在Winforms中,Form有一个HandleIsHandleCreated属性。如果IsHandleCreated被命名为HandleIsCreated,那么它将接近Handle属性,并且更易于查找(不会在Intellisense中隐藏下来)。

+0

好想法。我没有想到这些,因为我专注于代码的外观。这不仅会创建可读代码,而且会更容易维护代码。 –

+0

我从来没有考虑过这个想法......我非常喜欢它。然而,我担心它与大多数人的期望不符,因为它会使代码难以使用/维护。 – rmeador

8

我同意你的意见。对我来说,IsDataCopied更可读。

更一般地说,在我看来,VerifyCopyData对于它是严格意义上的验证方法还是实际上是否做了某些事情是不明确的。 IsDataCopied非常清楚,它只检查数据是否被复制。

1

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

再次,做什么是有道理的。

+0

downvoted?真?哇人... – Jason

+0

@Jason这是一个串行驱动的downvoter。至少有一票的每个人都受到了打击,包括我在内。 –

+0

@matt人们真的没有更好的办法,是吗? – Jason

0

如果您的方法可以包含一个动词,可以帮助描述该方法的功能,这很好。 VerifyCopyData听起来像它验证数据,而isDataCopied听起来像它测试一些事实的存在。这是一个微妙的区别。 Nitpick:我会打电话给第一个方法VerifyCopiedData

1

我觉得“是”更清楚。名为“VerifyCopyData()”的函数可能会在数据未被复制或发生副作用时引发异常。可能不会,但如果我读了它,我不确定期望它做什么。前缀为Is的函数是明确的:该函数没有副作用,只会将布尔答案返回给问题。

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

0

如果它本来是我想要的任何其他名称,但VerifyCopyData肯定比isDataCopied可读性差。

0

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

验证前缀不是很清楚,因为它可能是一个无效函数或不返回任何内容的子例程。例如,验证可能意味着它检查了一些事情,并在出现问题时抛出异常。 Is前缀意味着你在问一个问题,因此将返回一个答案。

1

这绝对是主观的,并且在不同的时间(使用不同的图书馆甚至不同的语言),我都使用这样的前缀并且从来没有使用过它们,因此混合这个约定并不使用它往往是一个错误。根据上下文确定哪一个最清楚,包括该项目/库/等中已经完成的内容。

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

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

1

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

我的建议是:

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

如果这是一种方法,为什么调用者不应该预期潜在的昂贵的副作用?如果没有,这将是一个财产。 –

0

我喜欢Is当谈到变量和属性

if(o.IsDataCopied) 
{ 
} 

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

if(DataIsCopied()) 
{ 
} 
1

data.isCopied()

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