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)
但我想没有硬性规定 - 只要保持一致
Kai*_*Kai 34
我会说userExists,因为90%的时间我的调用代码看起来像这样:
if userExists(...) {
...
}
Run Code Online (Sandbox Code Playgroud)
它的字面意思是英文.
if isUserExist而且if doesUserExist似乎多余.
Kon*_*man 14
可读性的目标应始终是编写尽可能接近自然语言的代码.所以在这种情况下,userExists似乎是最好的选择.例如,使用前缀"is"可能在另一种情况下是正确的isProcessingComplete.
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的函数无论如何都会消失,而不是向对象询问其状态,而是告诉它做某事,它可以做不同的事情.基于其状态的方式.
我对这个问题的简单规则是:
如果布尔方法已经有一个动词,不要添加一个。否则,考虑一下。一些例子:
$user->exists()
$user->loggedIn()
$user->isGuest() // "is" added
Run Code Online (Sandbox Code Playgroud)
小智 5
有些事情需要考虑,我认为其他几个答案都错过了
这取决于它是C++类方法还是C函数.如果这是一个方法,那么它可能会被称为if (user.exists()) { ... }或if (user.isExisting()) { ... }
没有if (user_exists(&user)).这就是编码标准背后的原因,即bool方法应该以动词开头,因为当对象在它们前面时它们会像句子一样读.
遗憾的是,许多旧的C函数返回0表示成功,非零表示失败因此很难确定正在使用的样式,除非您遵循所有bool函数以动词开头或总是比较为真如此 if (true == user_exists(&user))