布尔方法命名可读性

简单的问题,从可读性的angular度来看,你喜欢哪种方法名称的布尔方法:

public boolean isUserExist(...) 

要么:

 public boolean doesUserExist(...) 

要么:

 public boolean userExists(...) 
 public boolean userExists(...) 

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

 if userExists ... 

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

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

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

它的英文字面非常清晰。

if isUserExistif 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保持一致。

有些事情要考虑,我认为在这里还有其他答案

  1. 这取决于这是一个C ++类方法还是一个C函数。 如果这是一个方法,那么它可能会被调用if (user.exists()) { ... }if (user.isExisting()) { ... }
    不是if (user_exists(&user)) 。 这就是编码标准背后的原因,即状态布尔方法应该以动词开始,因为当对象位于它们的前面时,它们将会像一个句子一样读取。

  2. 不幸的是很多旧的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( ... ) )