布尔方法命名可读性

Yuv*_*dam 103 api readability naming-conventions

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

public boolean isUserExist(...)
Run Code Online (Sandbox Code Playgroud)

要么:

public boolean doesUserExist(...)
Run Code Online (Sandbox Code Playgroud)

要么:

public boolean userExists(...)
Run Code Online (Sandbox Code Playgroud)

Mar*_*tin 93

public boolean userExists(...)
Run Code Online (Sandbox Code Playgroud)

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

if userExists ...
Run Code Online (Sandbox Code Playgroud)

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

  • 另一方面,在隔离或不紧跟"if"之后,"userExists()"听起来像是一个事实陈述,而不是它的意图.与"IsUserExisting()"或"DoesUserExist()"不同,后者遵循英语自然语言单词顺序规则的直接问题. (10认同)
  • @RJFalconer 有时您可能需要在多个地方使用该方法的结果,因此您会将其分配给变量。由于方法被称为`userExists`,你将声明什么名称的变量?`userExists` 适用于变量,而不适用于方法。正如@Oskar 所写-听起来像是陈述,而不是问题。 (4认同)
  • "使你的{方法调用}更像是自然英语"听起来像是对全面理性命名的一个很好的考验.澄清了我对此事的看法 - 谢谢! (3认同)
  • ..但是为什么会在“ if”之外使用返回布尔值的方法呢?如果它们有副作用,那就更有气味了。如果if IsUserExisting()和if IfUserExist()看起来太可怕了,应该避免。 (2认同)

Kai*_*Kai 34

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

if userExists(...) {
  ...
}
Run Code Online (Sandbox Code Playgroud)

它的字面意思是英文.

if isUserExist而且if doesUserExist似乎多余.


Kon*_*man 14

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

  • 对于第二个例子,“ProcessingIsComplete”是否更接近自然语言?例如: if (ProcessingIsComplete()) (2认同)

Mic*_*ker 13

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

虽然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) ...
Run Code Online (Sandbox Code Playgroud)

其中读作为"如果用户点达到年龄大于或等于18 ......"是真的 - 这不是"自然英语",但我认为它object.verb从不像自然英语,这只是现代编程的基本方面(对于许多主流语言).程序员一般在理解上述陈述时没有问题,以下情况会更糟吗?

if (user.CheckExists() == true)
Run Code Online (Sandbox Code Playgroud)

通常缩短为

if (user.CheckExists())
Run Code Online (Sandbox Code Playgroud)

紧随其后的致命一步

if (user.Exists())
Run Code Online (Sandbox Code Playgroud)

虽然有人说"代码读取的次数比写入次数多10倍",但是很容易发现错误也很重要.假设您有一个名为Exists()的函数,该函数使对象存在,并根据成功返回true/false.你可以很容易地看到代码,if (user.Exists())而不是发现错误 - 如果代码读取错误将更加明显if (user.SetExists()).

此外,user.Exists()可以轻松地包含复杂或低效的代码,向数据库转发以检查某些内容.user.CheckExists()清楚地表明函数做了一些事情.

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

作为最后一点 - 在"告诉不要问"之后,许多返回true/false的函数无论如何都会消失,而不是向对象询问其状态,而是告诉它做某事,它可以做不同的事情.基于其状态的方式.

  • @RJFalconer “大多数开发人员”是你这句话的关键。我想说,如果“CheckExists()”除了检查某些内容是否存在之外还执行其他任何操作,“所有开发人员”都会感到惊讶。并不是说 `Exists()` 是一个糟糕的名字,只是 `CheckExists()` 是一个更好的名字,这个问题是问,作为一般原则,最好的命名模式是什么?答案是像对待任何其他函数一样对待它,以动词开头名称,并且不要仅仅因为它返回布尔值而使用不同的模式。 (3认同)
  • >“假设您有一个名为Exists()的函数,该函数导致对象存在”,这已经是一个问题。这种方法应该是动词,例如“ Create”。至少它是“存在”,但很少使用“存在”作为动词。“尚不清楚ExistsInDatabase是在检查它是否确实存在,还是设置它确实存在的事实。”非常清楚。我可以断言,如果这样做除返回布尔值外,其他大多数开发人员都会感到惊讶。 (2认同)

Dav*_*vid 8

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

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

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


Jon*_*han 7

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

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

$user->exists()
$user->loggedIn()
$user->isGuest() // "is" added
Run Code Online (Sandbox Code Playgroud)


小智 5

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

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

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