简单的问题,从可读性的角度来看,您更喜欢哪种方法名称为布尔方法:
public boolean isUserExist(...)
或:
public boolean doesUserExist(...)
或:
public boolean userExists(...)
答案 0 :(得分:87)
public boolean userExists(...)
将是我的首选。因为它使你的条件检查更像自然英语:
if userExists ...
但我想没有严格的规则 - 只要保持一致
答案 1 :(得分:32)
我会说userExists
,因为90%的时间我的调用代码看起来像这样:
if userExists(...) {
...
}
它的字面意思是英文。
if isUserExist
和if 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 convention,Python和Ruby也是如此。希望这是一个多样化的集合,称这是一个与语言无关的答案。一般来说,我会支持使用与您的语言API保持一致的命名方法。
答案 5 :(得分:5)
有些事情需要考虑,我认为其他几个答案都错过了
这取决于它是C ++类方法还是C函数。如果这是一种方法,那么它可能会被称为if (user.exists()) { ... }
或if (user.isExisting()) { ... }
不是if (user_exists(&user))
。
这就是为什么bool方法应该以动词开头的编码标准背后的原因,因为当对象在它们前面时它们会像句子一样读。
不幸的是,许多旧的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()) {...}