【问题标题】:Naming conventions for Java methods that return boolean返回布尔值的 Java 方法的命名约定
【发布时间】:2011-04-21 22:06:33
【问题描述】:

我喜欢在其他语言的方法/函数名称末尾使用问号。 Java 不允许我这样做。作为一种解决方法,我还能如何在 Java 中命名布尔返回方法?在某些情况下,在方法前面使用ishasshouldcan 听起来不错。有没有更好的方法来命名这些方法?

例如创建新鲜快照?

【问题讨论】:

  • 什么语言允许在方法名中使用?
  • @SLaks、Scheme、Ruby ...
  • 在方案中,我们总是在方法名的末尾加上p
  • @Erick:并非总是如此,但“p”是指定谓词的一种标准方式
  • 我们 = 我的本科课程总是这样。我永远不会在 Java 中使用这种约定。

标签: java methods naming-conventions


【解决方案1】:

惯例是在名字中提问。

这里有几个可以在 JDK 中找到的例子:

isEmpty()

hasChildren()

这样,名称的读取方式就像在末尾带有问号一样。

集合是空的吗?
这个节点有孩子吗?

然后,true 表示是,false 表示否。

或者,您可以像断言一样阅读它:

集合为空。
该节点有子节点

注意:
有时您可能希望将方法命名为 createFreshSnapshot?。如果没有问号,则该名称暗示该方法应该创建快照,而不是检查是否需要快照。

在这种情况下,您应该重新考虑您的实际要求。 isSnapshotExpired 之类的名称更好,它传达了该方法在调用时将告诉您的内容。遵循这样的模式还可以帮助您保持更多的函数纯净且没有副作用。

如果您在 Java API 中为 isEmpty() 执行 Google Search,您会得到很多结果。

【讨论】:

  • createFreshSnapshot 怎么样?
  • @letr,好吧,我可能会将它重命名为 lit isSnapshotExpired 或类似的名称。 (根据您的标准)
  • 我通过使用“应该”这个词来解决“createFrshSnapshot”问题 - 即“shouldCreateFreshSnapshot()”(尽管在这种情况下 isSnapshotExpired() 更好)
  • 我检查是否应该使用shouldHeartbeat() 方法发送心跳消息。
  • 为什么认为isEmpty()hasChildren()问题,而不是断言?如果您将这些名称视为断言或谓词,它实际上在英文中读起来会更好。
【解决方案2】:

如果您希望您的类与Java Beans specification 兼容,以便使用反射的工具(例如JavaBuildersJGoodies Binding)可以识别布尔getter,请使用getXXXX()isXXXX() 作为方法名称.来自 Java Beans 规范:

8.3.2 布尔属性

此外,对于布尔属性,我们允许使用 getter 方法来匹配模式:

public boolean is属性名>();

可以提供这个“isPropertyName>”方法来代替“getPropertyName>”方法,或者除了“get”之外还可以提供它PropertyName>” 方法。在任何一种情况下,如果布尔属性存在“isPropertyName>”方法,那么我们将使用“isPropertyName>”方法来读取属性值.一个示例布尔属性可能是:

public boolean isMarsupial();
public void setMarsupial(boolean m);

【讨论】:

  • 当你说public boolean is<PropertyName>(); 时,它看起来像一个泛型。
  • 嘿,我只是在引用规范。我会按照规范用斜体显示。
  • 我不在乎 Java bean 的兼容性,我只希望我的方法名称听起来正确 :)
  • 即使您不关心 Javabeans 的兼容性,命名约定也值得遵循,因为它已经超出了 IDE 中配置的“beans”的原始范围。例如,如果使用 isEmpty 作为方法名,则可以使用 object.empty 从 JSP 调用该方法,但是不能调用带有其他前缀的方法,因此不能使用 object.children 调用 object.hasChildren()。因此,JSP 和 EL(表达式语言)允许您访问 Javabeans 属性。如果你问我,这是一个很大的胜利。
  • JavaBeans 非常具体,谢谢提醒。我经常想知道并且倾向于认为我被“is”前缀所困扰,但实际上根本不是。
【解决方案3】:

我想发布此链接,因为它可能有助于进一步检查此答案并寻找更多 java 样式约定

Java Programming Style Guidelines

Item "2.13 is 前缀应该用于布尔变量和方法。"特别相关并建议使用 is 前缀。

风格指南继续建议:

is 前缀有一些替代方案,在某些情况下更适合。这些是 hascanshould 前缀:

boolean hasLicense();
boolean canEvaluate();
boolean shouldAbort = false;

如果您遵循指南,我相信会命名适当的方法:

shouldCreateFreshSnapshot()

【讨论】:

  • 仅供参考,有版权岩土软件服务指南。也就是说,他们在底部引用了来源以表明他们是合法的。
【解决方案4】:

对于可能失败的方法,即你指定 boolean 作为返回类型,我会使用前缀 try:

if (tryCreateFreshSnapshot())
{
  // ...
}

对于所有其他情况,请使用 is.. has.. was.. can.. allows.. 之类的前缀 ..

【讨论】:

  • 但 try 并没有表明这是一个问题(有返回值)。
  • 从不返回布尔值来指示方法是否失败。如果方法失败,则抛出异常。想象一下方法失败了,你得到一个错误,你将如何确定到底出了什么问题?
【解决方案5】:

标准是使用ishas 作为前缀。例如isValidhasChildren

【讨论】:

    【解决方案6】:

    is 是我遇到的最多的人。不过,在当前情况下任何有意义的事情都是最好的选择。

    【讨论】:

      【解决方案7】:

      我想对这个通用命名约定提出不同的看法,例如:

      java.util.Set:boolean add​(E e)

      理由是:

      然后进行一些处理 报告 是否成功

      虽然return 确实是boolean,但方法的名称应该指向要完成的处理,而不是结果类型(本例中为布尔值)。

      在我看来,您的createFreshSnapshot 示例与此观点更相关,因为似乎意味着:创建一个新快照,然后报告创建操作是否成功。考虑到这种推理,createFreshSnapshot 似乎是最适合您的情况的名称。

      【讨论】:

      • 我不知道你为什么被否决,我同意。即使我避免使用它,因为它根本不是语义的,它是许多内部 java API 使用的约定。
      • 我猜是因为最初我只写了“Set: boolean add​(E e)”所以人们没有注意到那是关于众所周知的 java.util.Set;或者可能是因为我的英语太差了:D。感谢您的支持:)
      猜你喜欢
      • 1970-01-01
      • 2011-06-24
      • 1970-01-01
      • 1970-01-01
      • 2017-07-23
      • 1970-01-01
      • 2012-11-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多