简单的问题,从可读性的角度来看,您更喜欢哪个方法名称作为布尔方法:
public boolean isUserExist(...)
或者:
public boolean doesUserExist(...)
或者:
public boolean userExists(...)
简单的问题,从可读性的角度来看,您更喜欢哪个方法名称作为布尔方法:
public boolean isUserExist(...)
或者:
public boolean doesUserExist(...)
或者:
public boolean userExists(...)
public boolean userExists(...)
会是我的首选。因为它使您的条件检查更像自然英语:
if userExists ...
但我想没有硬性规定——只要保持一致
我会说userExists
,因为 90% 的时间我的调用代码看起来像这样:
if userExists(...) {
...
}
它的英文字面意思很清楚。
if isUserExist
并且if doesUserExist
显得多余。
注意在追求可读性的同时牺牲清晰度。
虽然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) ...
读作“如果用户 dot get age 大于或等于 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() 清楚地表明该函数做了一些事情。
另请参阅此处的所有回复:命名约定:如何命名返回布尔值的方法?
最后一点 - 在“告诉不要问”之后,许多返回真/假的函数无论如何都会消失,而不是询问对象的状态,而是告诉它做某事,它可以用不同的方式做基于其状态的方式。
可读性的目标应该始终是编写尽可能接近自然语言的代码。所以在这种情况下,userExists
似乎是最好的选择。然而,在其他情况下使用前缀“is”可能是正确的,例如isProcessingComplete
.
我会选择 userExists() 因为 1) 它在自然语言中是有意义的,并且 2) 它遵循我所见过的 API 的约定。
要查看它在自然语言中是否有意义,请大声朗读。“如果用户存在”听起来更像是一个有效的英语短语,而不是“如果用户存在”或“如果用户存在”。“如果用户存在”会更好,但“the”在方法名称中可能是多余的。
要查看 Java SE 6 中是否存在文件,您可以使用 File.exists()。这看起来在版本 7中是一样的。C# 使用相同的约定,Python和Ruby也是如此。希望这是一个足够多样化的集合,可以称之为与语言无关的答案。一般来说,我会支持与您的语言 API 保持一致的命名方法。
我对这个问题的简单规则是:
如果布尔方法已经有一个动词,不要加一个。否则,考虑一下。一些例子:
$user->exists()
$user->loggedIn()
$user->isGuest() // "is" added
有些事情需要考虑,我认为这里的其他几个答案都错过了
这取决于这是 C++ 类方法还是 C 函数。如果这是一种方法,那么它可能会被调用if (user.exists()) { ... }
或if (user.isExisting()) { ... }
不被调用if (user_exists(&user))
。这就是编码标准背后的原因,即 state bool 方法应该以动词开头,因为当对象在它们面前时,它们会读起来像一个句子。
不幸的是,许多旧的 C 函数返回 0 表示成功,非零表示失败,因此很难确定正在使用的样式,除非您遵循所有以动词开头的布尔函数或总是像这样与 true 比较if (true == user_exists(&user))
纯属主观。
我更喜欢userExists(...)
这样的陈述,因为这样的陈述读起来更好:
if ( userExists( ... ) )
或者
while ( userExists( ... ) )
在这种特殊情况下,第一个例子是如此糟糕的英语,它让我畏缩。
我可能会选择第三名,因为在 if 语句中阅读它时听起来如何。“如果用户存在”听起来比“如果用户存在”更好。
这是假设它将用于 if 语句测试当然......
我喜欢其中任何一个:
userExists(...)
isUserNameTaken(...)
User.exists(...)
User.lookup(...) != null
方法名称用于提高可读性,只有适合整个代码的方法才是最好的,大多数情况下它以条件开头,因此 subjectPredicate 遵循自然句子结构。
那为什么不重命名该属性呢?
if (user.isPresent()) {
由于我遵循约定将动词放在函数名称之前,因此我也会在这里做同样的事情:
//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()) {...}