布尔方法命名可读性

时间:2009-10-14 14:42:06

标签: api naming-conventions readability

简单的问题,从可读性的角度来看,您更喜欢哪种方法名称为布尔方法:

public boolean isUserExist(...)

或:

public boolean doesUserExist(...)

或:

public boolean userExists(...)

13 个答案:

答案 0 :(得分:87)

public boolean userExists(...)

将是我的首选。因为它使你的条件检查更像自然英语:

if userExists ...

但我想没有严格的规则 - 只要保持一致

答案 1 :(得分:32)

我会说userExists,因为90%的时间我的调用代码看起来像这样:

if userExists(...) {
  ...
}

它的字面意思是英文。

if isUserExistif doesUserExist似乎是多余的。

答案 2 :(得分:14)

可读性的目标应始终是编写尽可能接近自然语言的代码。所以在这种情况下,userExists似乎是最好的选择。在其他情况下,使用前缀“is”可能是正确的,例如isProcessingComplete

答案 3 :(得分:12)

在追逐可读性的同时谨防牺牲清晰度

虽然if (user.ExistsInDatabase(db))读取的内容比if (user.CheckExistsInDatabase(db))好,但请考虑具有构建器模式的类(或任何可以设置状态的类)的情况:

user.WithName("Mike").ExistsInDatabase(db).ExistsInDatabase(db2).Build();

目前尚不清楚ExistsInDatabase是否检查它是否存在,或者确定它是否存在这一事实。你不会在没有任何比较值的情况下编写if (user.Age())if (user.Name()),那么为什么if (user.Exists())是一个好主意,因为该属性/函数是布尔类型的,你可以重命名函数/属性阅读更像自然英语?遵循我们用于除布尔以外的其他类型的相同模式是否如此糟糕?

对于其他类型,if语句将函数的返回值与代码中的值进行比较,因此代码如下所示:

if (user.GetAge() >= 18) ...

其中读作为“如果用户点年龄大于或等于18 ......”是真的 - 这不是“自然英语”,但我认为object.verb永远不会像自然英语那样,这只是简单的现代编程的基本方面(适用于许多主流语言)。程序员在理解上述陈述时通常没有问题,以下情况会更糟吗?

if (user.CheckExists() == true)

通常缩短为

if (user.CheckExists())

紧随其后的致命一步

if (user.Exists())

虽然有人说“代码读取的次数比写入次数高10倍”,但是很容易发现错误也很重要。假设您有一个名为Exists()的函数,该函数使对象存在,并根据成功返回true / false。你可以很容易地看到代码if (user.Exists())并且没有发现错误 - 例如,如果代码读取if (user.SetExists()),则错误会更加明显。

此外,user.Exists()可以轻松地包含复杂或低效的代码,往返于数据库以检查某些内容。 user.CheckExists()清楚地表明该函数可以执行某些操作。

另请参阅此处的所有回复:Naming Conventions: What to name a method that returns a boolean?

作为最后一点 - 在“告诉不要问”之后,很多返回true / false的函数无论如何都会消失,而不是要求对象的状态,你告诉它做一些事情,它可以根据其状态以不同的方式做。

答案 4 :(得分:8)

我会选择userExists(),因为1)它在自然语言中是有意义的,2)它遵循我见过的API的约定。

要看自然语言是否有意义,请大声朗读。 “如果用户存在”听起来更像是有效的英语短语而不是“如果用户存在”或“如果用户存在”。 “如果用户存在”会更好,但“the”在方法名称中可能是多余的。

要查看Java SE 6中是否存在文件,您需要use File.exists()。看起来它将是相同的in version 7。 C#使用the same conventionPythonRuby也是如此。希望这是一个多样化的集合,称这是一个与语言无关的答案。一般来说,我会支持使用与您的语言API保持一致的命名方法。

答案 5 :(得分:5)

有些事情需要考虑,我认为其他几个答案都错过了

  1. 这取决于它是C ++类方法还是C函数。如果这是一种方法,那么它可能会被称为if (user.exists()) { ... }if (user.isExisting()) { ... } 不是if (user_exists(&user))。 这就是为什么bool方法应该以动词开头的编码标准背后的原因,因为当对象在它们前面时它们会像句子一样读。

  2. 不幸的是,许多旧的C函数返回0表示成功,非零表示失败因此很难确定正在使用的样式,除非您遵循所有bool函数以动词开头或总是比较为真如此if (true == user_exists(&user))

答案 6 :(得分:3)

我对这个问题的简单规则是:

如果布尔方法已经是动词,请不要添加动词。否则,考虑一下。一些例子:

$user->exists()
$user->loggedIn()
$user->isGuest() // "is" added

答案 7 :(得分:1)

纯粹主观。

我更喜欢userExists(...),因为这样的陈述更好看:

if ( userExists( ... ) )

while ( userExists( ... ) )

答案 8 :(得分:1)

在这个特殊情况下,第一个例子是如此可怕的英语,它让我畏缩。

我可能会选择第三,因为在if语句中阅读它时听起来如何。 “如果用户存在”听起来好于“如果用户存在”。

这假设它当然会用于if语句测试......

答案 9 :(得分:1)

我喜欢以下任何一种:

userExists(...)
isUserNameTaken(...)
User.exists(...)
User.lookup(...) != null

答案 10 :(得分:0)

方法名称用于可读性,只有符合整个代码的方法才是最好的,大多数情况下它以条件开始,因此subjectPredicate遵循自然句子结构。

答案 11 :(得分:0)

为什么不重命名该属性?

if (user.isPresent()) {

答案 12 :(得分:0)

因为我遵循惯例将动词放在函数名之前,所以我也会在这里做同样的事情:

//method name
public boolean doesExists(...)

//this way you can also keep a variable to store the result
bool userExists = user.doesExists()

//and use it like a english phrase
if (userExists) {...}

//or you can use the method name directly also and it will make sense here too
if (user.doesExists()) {...}