命名可读性的布尔方法

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

public boolean isUserExist(...)

或:

public boolean doesUserExist(...)

或:

public boolean userExists(...)
92754 次浏览
public boolean userExists(...)

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

if userExists ...

但是我想并没有什么硬性规定——只要保持一致就行了

我会说 userExists,因为90% 的情况下我的调用代码都是这样的:

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

它用英语读起来非常字面化。

if isUserExistif doesUserExist似乎是多余的。

完全主观。

我更喜欢 userExists(...),因为这样的语句读起来会更好:

if ( userExists( ... ) )

或者

while ( userExists( ... ) )

在这个特殊的例子中,第一个例子是如此糟糕的英语,它使我退缩。

我可能会选择第三个,因为在阅读 if 语句时,它听起来是这样的。“如果用户存在”听起来比“如果用户存在”好。

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

这些我都喜欢:

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

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

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

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

要查看 JavaSE6中是否存在文件,可以使用 使用 File.vis ()。这看起来会是相同的 第7版。C # 使用 同样的惯例巨蟒露比也是如此。希望这是一个多样化的集合,足以称之为语言不可知论的答案。一般来说,我会站在命名方法这一边,以便与您的语言的 API 保持一致。

有些事情需要考虑,我认为这里的其他几个答案忽略了这一点

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

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

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

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

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

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

在追逐 可读性的同时要小心牺牲 清晰

尽管 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()),那么错误就会非常明显。

另外,用户。Exists ()可以很容易地包含复杂或低效的代码,通过往返数据库来检查某些内容。使用者。CheckExists ()清楚地表明该函数执行了某些操作。

也可以在这里看到所有的回答: 命名约定: 如何命名一个返回布尔值的方法?

在“ Tell Don’t Ask”之后的最后一个注释中,许多返回 true/false 的函数无论如何都会消失,而不是要求一个对象处于其状态,你告诉它做一些事情,它可以根据其状态以不同的方式进行操作。

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

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()) {...}