布尔方法命名的可读性


120

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

public boolean isUserExist(...)

要么:

public boolean doesUserExist(...)

要么:

public boolean userExists(...)

21
第一个听起来像isBabbyFormed

取决于语言。不同的语言有不同的约定;我想到了Java和ObjectiveC。也是主观的。
杰德·史密斯

主观-不够公平
尤瓦尔·亚当

2
纯粹是主观的。getUserExistenceuserIsNotExtinctuserHasExistentialState等...
dreamlax

萨特(Sartre)将感到骄傲
康奈尔·马森

Answers:


112
public boolean userExists(...)

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

if userExists ...

但我想这没有硬性规定-保持一致


3
“使您的{method call}更像是自然的英语”听起来像是对全面理性命名的很好考验。澄清了我对此事的想法-谢谢!
cori 2011年

16
另一方面,孤立地或在紧接在“ if”之后时,“ userExists()”听起来像是对事实的陈述,而不是所要表达的问题。与“ IsUserExisting()”或“ DoesUserExist()”不同,后者遵循英语自然语言单词顺序规则处理直截了当的问题。
Oskar Berggren

4
..但是为什么要在布尔值之外使用返回布尔值的方法if呢?如果它们有副作用,那就更有气味了。if IsUserExisting()并且if DoesUserExist()看起来可怕,应该避免。
RJFalconer

@RJFalconer有时您可能需要在多个地方使用该方法的结果,因此将其分配给变量。由于方法被调用userExists,您将声明什么变量名称?userExists对变量有益,对方法不利。正如@Oskar所写-听起来像是声明,不是问题。
雅罗斯瓦夫Wlazło

对于必须有主语,谓语和宾语的情况,例如UserSessionIsComplete或IsUserSessionComplete,您更喜欢哪一个?

40

我会说userExists,因为90%的时间我的调用代码将如下所示:

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

它的字面意思是英文。

if isUserExistif doesUserExist似乎是多余的。


18

在追求可读性的同时提防牺牲清晰度

尽管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()清楚地表明该函数执行了某些操作。

另请参见此处的所有响应:命名约定命名返回布尔值的方法的名称是什么?

作为最后的注释-在“告诉不问”之后,许多返回true / false的函数无论如何都会消失,并且告诉对象做某事,而不是向对象询问其状态,可以用不同的方法来做根据其状态的方式。


2
> Suppose you had a function called Exists() which causes the object to exist这已经是一个问题。这种方法应该是动词,例如Create。至少应该是Exist,但是很少使用“存在”作为动词。 It's not clear if ExistsInDatabase is checking whether it does exist, or setting the fact that it does exist.很清楚 我可以断言,如果这样做除了返回布尔值之外,其他任何开发人员都会感到惊讶。
RJFalconer

@RJFalconer Most developers是您在此处句子的关键。我要说的all developers是,如果CheckExists()除了检查某物之外还进行其他任何操作,将会感到惊讶。这不是Exists()一个糟糕的名字,而是CheckExists()一个更好的名字,这个问题作为一个总的原则在问,最好的命名方式是什么?答案是将其像其他函数一样对待,以动词开头名称,不要仅仅因为它返回布尔值就使用其他模式。
Michael Parker

是的,问题是关于布尔方法的最佳命名模式BUT。布尔方法是唯一的,并且具有自己的通用名称-谓词。您不应该像其他功能一样对待它们。将动词放在布尔方法名称中的问题旁边是多余的。这对代码的可读性有负面影响。以问题形式命名布尔型方法(不带任何动词)被认为是业界的最佳做法。示例: docs.microsoft.com/en-us/dotnet/api/system.io.file.exists developer.android.com/reference/java/io/File#exists()–
Almir

@Almir File.Exists是一个非常古老的调用(至少是点网1.1),并且不是现代可读性标准的一个很好的例子。查看现代的点网核心API,了解微软如何达成协议的更多现代示例:github.com/dotnet/sdk,一些随机示例链接 链接 链接
Michael Parker

15

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


1
对于第二个示例,您是否ProcessingIsComplete更接近自然语言?例如:if(ProcessingIsComplete())
Yang

9

我将使用userExists(),因为1)它在自然语言中很有意义,并且2)它遵循了我所看到的API的约定。

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

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


5

我认为有些事情我想被其他一些答案遗漏了

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

  2. 不幸的是,许多旧的C函数成功返回0,失败返回非零,因此,除非您遵循所有布尔函数以动词开头或始终将其与true相比,否则很难确定所使用的样式。 if (true == user_exists(&user))


5

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

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

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

2

纯粹是主观的。

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

if ( userExists( ... ) )

要么

while ( userExists( ... ) )

1

在这种情况下,第一个例子是令人恐惧的英语,这让我畏缩了。

我可能会选择第三位,因为在if语句中读取它的声音。“如果用户存在”听起来比“如果用户存在”更好。

这是假设它肯定会在if语句测试中使用...


1

我喜欢以下任何一个:

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

0

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.