Api 布尔方法命名可读性
从可读性的角度来看,一个简单的问题是,对于布尔方法,您更喜欢哪个方法名:Api 布尔方法命名可读性,api,naming-conventions,readability,Api,Naming Conventions,Readability,从可读性的角度来看,一个简单的问题是,对于布尔方法,您更喜欢哪个方法名: public boolean isUserExist(...) 或: 或: 是我的首选。因为它使您的条件检查更像自然英语: if userExists ... 但我想没有硬性规定——只要保持一致就行了。我会说,userExists,因为90%的时间我的呼叫代码都是这样的: if userExists(...) { ... } 它的英文读起来非常直白 如果isUserExist和如果不存在似乎是多余的。纯粹是主观的
public boolean isUserExist(...)
或:
或:
是我的首选。因为它使您的条件检查更像自然英语:
if userExists ...
但我想没有硬性规定——只要保持一致就行了。我会说,
userExists
,因为90%的时间我的呼叫代码都是这样的:
if userExists(...) {
...
}
它的英文读起来非常直白
如果isUserExist
和如果不存在
似乎是多余的。纯粹是主观的
我更喜欢userExists(…)
,因为这样的语句读起来更好:
if ( userExists( ... ) )
或
在这个特殊的例子中,第一个例子是如此糟糕的英语,它让我畏缩 我可能会选择第三个,因为在if语句中读它时,它听起来是怎样的。“如果用户存在”听起来比“如果用户存在”好 这是假设它将用于if语句测试当然…我喜欢以下任何一种:
userExists(...)
isUserNameTaken(...)
User.exists(...)
User.lookup(...) != null
可读性的目标应该始终是编写尽可能接近自然语言的代码。因此,在这种情况下,
userExists
似乎是最佳选择。在另一种情况下,使用前缀“is”可能是正确的,例如isProcessingComplete
我会选择userExists(),因为1)它在自然语言中是有意义的,2)它遵循了我见过的API的约定
要想知道它在自然语言中是否有意义,就大声读出来。“If user exists”听起来更像一个有效的英语短语,而不是“If is user exists”或“If do user exists”。“如果用户存在”会更好,但是“the”在方法名称中可能是多余的
要查看JavaSE6中是否存在文件,您需要。这看起来是一样的。C#使用,如do和。希望这是一个足够多样化的集合,可以称之为语言不可知论的答案。一般来说,我会根据你的语言API来命名方法。
有一些事情我认为在这里被其他几个答案错过了。
或If(user.exists()){…}
If(user.isExisting()){…}
不
。
这就是编码标准背后的原因,即state bool方法应该以动词开头,因为当对象在它们前面时,它们会像句子一样阅读如果(用户存在(&user))
if(true==user\u exists(&user))
方法名有助于可读性,只有适合整个代码的方法名才是最好的方法,在大多数情况下,它以条件开头,因此主语谓词遵循自然的句子结构。我对这个问题的简单规则是: 如果布尔方法已经有动词,请不要添加动词。否则,考虑一下。一些例子:
$user->exists()
$user->loggedIn()
$user->isGuest() // "is" added
在追求可读性的同时,要小心牺牲清晰度
<> >虽然<代码>(用户ExistsInDatabase(dB))比<代码> >(用户CheckExistsInDatabase(db)) >,考虑具有构造器模式的类的情况,(或您可以设置状态的任何类):
user.WithName(“Mike”).ExistsInDatabase(db.ExistsInDatabase(db2.Build()代码>
尚不清楚ExistsInDatabase
是否正在检查它是否确实存在,或者设置它确实存在的事实。如果(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倍”,但很容易发现bug也是非常重要的。假设您有一个名为Exists()的函数,该函数使对象存在,并根据成功返回true/false。例如,如果(user.Exists())读取if(user.SetExists())
代码,您就可以很容易地看到代码if(user.Exists())
,而不会发现错误
此外,user.Exists()可能很容易包含复杂或低效的代码,往返于数据库以检查某些内容。user.CheckExists()明确表示函数执行了某些操作
请参见此处的所有回复:
最后一点,在“告诉-不要问”之后,许多返回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()) {...}
第一个听起来像是isBabbyFormed,取决于语言。不同的语言有不同的习惯;我想到了Java和Objective C。也有点主观。主观-
if (user.CheckExists())
if (user.Exists())
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()) {...}