【问题标题】:Boolean method naming readability布尔方法命名可读性
【发布时间】:2010-12-06 17:00:07
【问题描述】:

简单的问题,从可读性的角度来看,您更喜欢哪个方法名称作为布尔方法:

public boolean isUserExist(...)

或:

public boolean doesUserExist(...)

或:

public boolean userExists(...)

【问题讨论】:

  • 第一个听起来像isBabbyFormed
  • 取决于语言。不同的语言有不同的约定;想到 Java 和 Objective C。也是主观的。
  • 主观 - 很公平
  • 纯主观。 getUserExistenceuserIsNotExtinctuserHasExistentialState 等...
  • 萨特会很自豪

标签: api naming-conventions readability


【解决方案1】:
public boolean userExists(...)

会是我的首选。因为它使您的条件检查更像自然英语:

if userExists ...

但我想没有硬性规定——只要保持一致即可

【讨论】:

  • “让你的 {method call} 更像自然英语”听起来像是对全面理性命名的一个很好的测试。澄清了我对此事的想法 - 谢谢!
  • 另一方面,孤立地或当不紧跟在“if”之后时,“userExists()”听起来像是事实陈述,而不是它原本打算提出的问题。与“IsUserExisting()”或“DoesUserExist()”不同,后者遵循英语自然语言词序规则,用于直截了当的问题。
  • ..但是为什么要在 if 之外使用返回布尔值的方法?如果它们有副作用,那就更难闻了。 if IsUserExisting()if DoesUserExist() 看起来很可怕,应该避免。
  • @RJFalconer 有时您可能需要在多个地方使用该方法的结果,因此您将其分配给变量。由于方法被称为userExists,你将声明什么变量名? userExists 适用于变量,而不是方法。正如@Oskar 所写 - 这听起来像是陈述,而不是问题。
  • 对于必须有主语、谓语和宾语的情况,例如UserSessionIsComplete或IsUserSessionComplete,您更喜欢哪一种?
【解决方案2】:

我会说userExists,因为 90% 的情况下我的调用代码看起来像这样:

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

而且它的英文字面意思很清楚。

if isUserExistif doesUserExist 似乎是多余的。

【讨论】:

    【解决方案3】:

    注意在追求可读性的同时牺牲清晰度

    虽然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) ...
    

    读作“如果用户 dot get 年龄大于或等于 18...” 是的 - 这不是“自然英语”,但我认为 object.verb 从来不像自然英语,这只是一个基本的现代编程的一个方面(对于许多主流语言)。程序员一般理解上面的说法是没有问题的,那么下面的说法是不是更糟?

    if (user.CheckExists() == true)
    

    通常缩写为

    if (user.CheckExists())
    

    紧接着是致命的一步

    if (user.Exists())
    

    虽然有人说“代码的阅读次数比编写次数多 10 倍”,但易于发现错误也很重要。假设您有一个名为 Exists() 的函数,它使对象存在,并根据成功返回 true/false。您可以很容易地看到代码 if (user.Exists()) 而没有发现错误 - 例如,如果代码读取为 if (user.SetExists()),错误会更加明显。

    此外,user.Exists() 很容易包含复杂或低效的代码,往返于数据库以检查某些内容。 user.CheckExists() 清楚地表明该函数做了一些事情。

    在此处查看所有回复:Naming Conventions: What to name a method that returns a boolean?

    最后一点 - 在“告诉不要问”之后,许多返回 true/false 的函数无论如何都会消失,而不是询问对象的状态,而是告诉它做某事,它可以根据其状态以不同的方式执行。

    【讨论】:

    • > Suppose you had a function called Exists() which causes the object to exist 这已经是个问题了。这样的方法应该是动词,如Create。至少它会是Exist,但很少使用“存在”作为动词。 It's not clear if ExistsInDatabase is checking whether it does exist, or setting the fact that it does exist. 很清楚。我会断言,如果除了返回一个布尔值之外,它还做了其他任何事情,大多数开发人员都会感到惊讶。
    • @RJFalconer Most developers 是你的句子的关键。我想说all developers 会感到惊讶,如果CheckExists() 除了检查是否存在之外还做了其他事情。并不是Exists() 是一个糟糕的名字,只是CheckExists() 是一个更好 的名字,而这个问题是问,作为一般原则,最好的命名模式是什么?答案是像对待任何其他函数一样对待它,名称以动词开头,不要仅仅因为它返回一个布尔值就使用不同的模式。
    • 是的,问题是关于布尔方法的最佳命名模式。 Bool 方法是唯一的,并且有自己的通用名称 - 谓词。你不应该像对待其他函数一样对待它们。将动词放在布尔方法名称中的问题旁边是多余的。它对代码的可读性有负面影响。以问题的形式命名布尔方法,不使用任何动词,被认为是业内的最佳实践。示例:docs.microsoft.com/en-us/dotnet/api/system.io.file.existsdeveloper.android.com/reference/java/io/File#exists()
    • @Almir File.Exists 是一个非常古老的调用(至少 dot net 1.1),并不是现代可读性标准的一个很好的例子。查看现代 dot net core API 以了解更多关于 Microsoft 如何同意的现代示例:github.com/dotnet/sdk,一些随机示例 link link link
    【解决方案4】:

    可读性的目标应该始终是编写尽可能接近自然语言的代码。所以在这种情况下,userExists 似乎是最好的选择。在其他情况下使用前缀“is”可能是正确的,例如isProcessingComplete

    【讨论】:

    • 第二个例子,ProcessingIsComplete 更接近自然语言吗?例如:if (ProcessingIsComplete())
    • 是的! processingIsComplete 很好。我更喜欢processingCompleted
    【解决方案5】:

    我会选择 userExists(),因为 1) 它在自然语言中是有意义的,并且 2) 它遵循我所见过的 API 的约定。

    要查看它在自然语言中是否有意义,请大声朗读。 “如果用户存在”听起来更像是一个有效的英语短语,而不是“如果用户存在”或“如果用户存在”。 “如果用户存在”会更好,但“the”在方法名称中可能是多余的。

    要查看 Java SE 6 中是否存在文件,您可以use File.exists()。这看起来将是相同的in version 7。 C# 使用 the same conventionPythonRuby。希望这是一个足够多样化的集合,可以称之为与语言无关的答案。一般来说,我会支持与您的语言 API 保持一致的命名方法。

    【讨论】:

      【解决方案6】:

      我对这个问题的简单规则是:

      如果布尔方法已经有一个动词,不要加一个。否则,考虑一下。一些例子:

      $user->exists()
      $user->loggedIn()
      $user->isGuest() // "is" added
      

      【讨论】:

        【解决方案7】:

        有些事情需要考虑,我认为这里的其他几个答案都错过了

        1. 这取决于这是 C++ 类方法还是 C 函数。如果这是一种方法,那么它可能会被称为if (user.exists()) { ... }if (user.isExisting()) { ... }
          不是if (user_exists(&user))。 这就是编码标准背后的原因,即 state bool 方法应该以动词开头,因为当对象在它们面前时,它们会读起来像一个句子。

        2. 不幸的是,许多旧的 C 函数返回 0 表示成功,非 0 表示失败,因此很难确定正在使用的样式,除非您遵循所有以动词开头的 bool 函数或总是像这样比较 true if (true == user_exists(&user))

        【讨论】:

          【解决方案8】:

          纯属主观。

          我更喜欢userExists(...),因为这样的陈述读起来更好:

          if ( userExists( ... ) )
          

          while ( userExists( ... ) )
          

          【讨论】:

            【解决方案9】:

            在这种特殊情况下,第一个例子的英语太糟糕了,让我畏缩不前。

            我可能会选择第三名,因为在 if 语句中阅读它时听起来如何。 “如果用户存在”听起来比“如果用户存在”更好。

            这是假设它当然会在 if 语句测试中使用......

            【讨论】:

              【解决方案10】:

              我喜欢这些:

              userExists(...)
              isUserNameTaken(...)
              User.exists(...)
              User.lookup(...) != null
              

              【讨论】:

                【解决方案11】:

                方法名称用于提高可读性,只有适合整个代码的方法才是最好的,大多数情况下它以条件开头,因此 subjectPredicate 遵循自然句子结构。

                【讨论】:

                  【解决方案12】:

                  那为什么不重命名属性呢?

                  if (user.isPresent()) {
                  

                  【讨论】:

                    【解决方案13】:

                    由于我遵循将动词放在函数名之前的约定,所以我也会在这里做同样的事情:

                    //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()) {...}
                    

                    【讨论】:

                      猜你喜欢
                      • 2011-06-24
                      • 2016-08-31
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2011-04-21
                      相关资源
                      最近更新 更多