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来命名方法。

有一些事情我认为在这里被其他几个答案错过了。 < P>这取决于这是C++类方法还是C函数。如果这是一个方法,则可能会调用

If(user.exists()){…}
If(user.isExisting()){…}

如果(用户存在(&user))
。 这就是编码标准背后的原因,即state bool方法应该以动词开头,因为当对象在它们前面时,它们会像句子一样阅读

  • 不幸的是,许多旧的C函数成功时返回0,失败时返回非0,因此很难确定使用的样式,除非您遵循所有布尔函数都以动词开头或总是与true比较,如so
    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()) {...}