154

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

public boolean isUserExist(...)

或者:

public boolean doesUserExist(...)

或者:

public boolean userExists(...)
4

13 回答 13

151
public boolean userExists(...)

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

if userExists ...

但我想没有硬性规定——只要保持一致

于 2009-10-14T14:45:52.197 回答
49

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

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

它的英文字面意思很清楚。

if isUserExist并且if doesUserExist显得多余。

于 2009-10-14T14:46:23.247 回答
22

注意在追求可读性的同时牺牲清晰度

虽然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() 清楚地表明该函数做了一些事情。

另请参阅此处的所有回复:命名约定:如何命名返回布尔值的方法?

最后一点 - 在“告诉不要问”之后,许多返回真/假的函数无论如何都会消失,而不是询问对象的状态,而是告诉它做某事,它可以用不同的方式做基于其状态的方式。

于 2014-09-09T15:59:54.453 回答
16

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

于 2009-10-14T14:53:11.690 回答
9

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

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

要查看 Java SE 6 中是否存在文件,您可以使用 File.exists()。这看起来在版本 7中是一样的。C# 使用相同的约定PythonRuby也是如此。希望这是一个足够多样化的集合,可以称之为与语言无关的答案。一般来说,我会支持与您的语言 API 保持一致的命名方法。

于 2010-01-15T03:19:26.707 回答
7

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

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

$user->exists()
$user->loggedIn()
$user->isGuest() // "is" added
于 2014-07-07T19:56:08.173 回答
5

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

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

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

于 2010-09-22T04:56:55.960 回答
2

纯属主观。

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

if ( userExists( ... ) )

或者

while ( userExists( ... ) )
于 2009-10-14T14:47:00.347 回答
1

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

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

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

于 2009-10-14T14:48:04.890 回答
1

我喜欢其中任何一个:

userExists(...)
isUserNameTaken(...)
User.exists(...)
User.lookup(...) != null
于 2009-10-14T14:48:40.793 回答
0

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

于 2011-01-18T08:25:15.457 回答
0

那为什么不重命名该属性呢?

if (user.isPresent()) {
于 2019-05-14T14:04:38.477 回答
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()) {...}
于 2021-06-01T08:46:10.623 回答