布尔方法命名可读性
简单的问题,从可读性的angular度来看,你喜欢哪种方法名称的布尔方法:
public boolean isUserExist(...)
要么:
public boolean doesUserExist(...)
要么:
public boolean userExists(...)
public boolean userExists(...)
将是我的首选。 因为这使得你的条件检查更像自然英语:
if userExists ...
但是我想没有硬性规定 – 只要保持一致
我会说userExists
,因为90%的时间我的调用代码将如下所示:
if userExists(...) { ... }
它的英文字面非常清晰。
if isUserExist
和if isUserExist
看起来多余。
可读性的目标应该始终是尽可能将自然语言编写成代码。 所以在这种情况下, userExists
似乎是最好的select。 使用前缀“is”可能在另一种情况下正确,例如isProcessingComplete
。
谨防牺牲清晰度,同时追求可读性 。
尽pipeif (user.ExistsInDatabase(db))
比if (user.CheckExistsInDatabase(db))
更好地读取,但考虑具有构build器模式的类(或者可以设置状态的任何类)的情况:
user.WithName("Mike").ExistsInDatabase(db).ExistsInDatabase(db2).Build();
ExistsInDatabase
是检查它是否存在,或者设置它确实存在的事实,目前还不清楚。 你不会写没有任何比较值的if (user.Age())
或if (user.Name())
,那么为什么if (user.Exists())
纯粹是因为该属性/函数是布尔值types,你可以重新命名的function/属性阅读更像自然英语? 遵循与布尔以外的其他types相同的模式是否糟糕?
对于其他types, if
语句将函数的返回值与代码中的值进行比较,所以代码如下所示:
if (user.GetAge() >= 18) ...
“如果用户点的年龄大于或等于18 …”的话,这就是真的 – 这不是“自然的英语”,但我会争辩说, object.verb
从来没有像自然的英语,这只是现代的一个基本的方面编程(对于许多主stream语言)。 程序员一般没有理解上面的语句的问题,那么下面更糟?
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的函数总是消失,而不是要求一个对象的状态,而是告诉它做一些事情,它可以做不同的事情基于其状态的方式。
我会用userExists(),因为1)它在自然语言中是有意义的,2)它遵循我见过的API的约定。
用自然语言来看它是否有意义,大声朗读。 “如果用户存在”听起来更像是一个有效的英语短语,而不是“如果用户存在”或“如果用户存在”。 “如果用户存在”会更好,但是“方法名称”中可能是多余的。
要查看Java SE 6中是否存在文件,可以使用File.exists() 。 这看起来在版本7中是一样的。 C#使用相同的约定 ,就像Python和Ruby一样 。 希望这是一个足够多样的集合,称这是一个语言不可知的答案。 一般来说,我会在命名方法方面与您的语言的API保持一致。
有些事情要考虑,我认为在这里还有其他答案
-
这取决于这是一个C ++类方法还是一个C函数。 如果这是一个方法,那么它可能会被调用
if (user.exists()) { ... }
或if (user.isExisting()) { ... }
不是if (user_exists(&user))
。 这就是编码标准背后的原因,即状态布尔方法应该以动词开始,因为当对象位于它们的前面时,它们将会像一个句子一样读取。 -
不幸的是很多旧的C函数返回0成功,非0失败,所以可能很难确定使用的样式,除非你遵循所有布尔函数以动词开头或总是比较真实如此
if (true == user_exists(&user))
我对这个问题的简单规则是这样的:
如果布尔方法已经有一个动词,不要添加一个。 否则,考虑一下。 一些例子:
$user->exists() $user->loggedIn() $user->isGuest() // "is" added
我喜欢这些:
userExists(...) isUserNameTaken(...) User.exists(...) User.lookup(...) != null
在这个特殊的例子中,第一个例子就是这样可怕的英语,它使我变得有些失望。
我可能会去第三,因为它在if语句中阅读时听起来如何。 “如果用户存在”听起来比“如果用户存在”更好。
这是假设它将被用于if语句testing当然…
方法名称是可读性的,只有那些适合你整个代码的才是最好的,它的大部分情况是以条件开始的,因此subjectPredicate遵循自然的句子结构。
纯粹是主观的。
我更喜欢userExists(...)
因为然后这样的语句读得更好:
if ( userExists( ... ) )
要么
while ( userExists( ... ) )