返回布尔值的 Java 方法的命名约定
Posted
技术标签:
【中文标题】返回布尔值的 Java 方法的命名约定【英文标题】:Naming conventions for Java methods that return boolean 【发布时间】:2011-04-21 22:06:33 【问题描述】:我喜欢在其他语言的方法/函数名称末尾使用问号。 Java 不允许我这样做。作为一种解决方法,我还能如何在 Java 中命名布尔返回方法?在某些情况下,在方法前面使用is
、has
、should
、can
听起来不错。有没有更好的方法来命名这些方法?
例如创建新鲜快照?
【问题讨论】:
什么语言允许在方法名中使用?
?
@SLaks、Scheme、Ruby ...
在方案中,我们总是在方法名的末尾加上p
@Erick:并非总是如此,但“p”是指定谓词的一种标准方式
我们 = 我的本科课程总是这样。我永远不会在 Java 中使用这种约定。
【参考方案1】:
惯例是在名字中提问。
这里有几个可以在 JDK 中找到的例子:
isEmpty()
hasChildren()
这样,名称的读取方式就像在末尾带有问号一样。
集合是空的吗? 这个节点有孩子吗?
然后,true
表示是,false
表示否。
或者,您可以像断言一样阅读它:
集合为空。 该节点有子节点
注意:
有时您可能希望将方法命名为 createFreshSnapshot?
。如果没有问号,则该名称暗示该方法应该创建快照,而不是检查是否需要快照。
在这种情况下,您应该重新考虑您的实际要求。 isSnapshotExpired
之类的名称更好,它传达了该方法在调用时将告诉您的内容。遵循这样的模式还可以帮助您保持更多的函数纯净且没有副作用。
如果您在 Java API 中为 isEmpty()
执行 Google Search,您会得到很多结果。
【讨论】:
createFreshSnapshot 怎么样? @letr,好吧,我可能会将它重命名为 litisSnapshotExpired
或类似的名称。 (根据您的标准)
我通过使用“应该”这个词来解决“createFrshSnapshot”问题 - 即“shouldCreateFreshSnapshot()”(尽管在这种情况下 isSnapshotExpired() 更好)
我检查是否应该使用shouldHeartbeat()
方法发送心跳消息。
为什么认为isEmpty()
和hasChildren()
是问题,而不是断言?如果您将这些名称视为断言或谓词,它实际上在英文中读起来会更好。【参考方案2】:
如果您希望您的类与Java Beans specification 兼容,以便使用反射的工具(例如JavaBuilders、JGoodies 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 前缀有一些替代方案,在某些情况下更适合。这些是 has、can 和 should 前缀:
boolean hasLicense();
boolean canEvaluate();
boolean shouldAbort = false;
如果您遵循指南,我相信会命名适当的方法:
shouldCreateFreshSnapshot()
【讨论】:
仅供参考,有版权岩土软件服务指南。也就是说,他们在底部引用了来源以表明他们是合法的。【参考方案4】:对于可能失败的方法,即你指定 boolean 作为返回类型,我会使用前缀 try
:
if (tryCreateFreshSnapshot())
// ...
对于所有其他情况,请使用 is..
has..
was..
can..
allows..
之类的前缀 ..
【讨论】:
但 try 并没有表明这是一个问题(有返回值)。 从不返回布尔值来指示方法是否失败。如果方法失败,则抛出异常。想象一下方法失败了,你得到一个错误,你将如何确定到底出了什么问题?【参考方案5】:标准是使用is
或has
作为前缀。例如isValid
、hasChildren
。
【讨论】:
【参考方案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。感谢您的支持:)以上是关于返回布尔值的 Java 方法的命名约定的主要内容,如果未能解决你的问题,请参考以下文章