114

我知道 Java 中布尔 getter 的约定是包含前缀“is”。

isEnabled
isStoreOpen

但是如果主语是复数呢?也就是说,如果我不想知道一家商店是否营业,而是想知道所有商店是否都营业,该怎么办?

isStoresOpen()在英语中没有意义。

我很想写像这样的吸气剂:

areStoresOpen
areDogsCute
areCatsFuzzy

我认为这是有道理的,但其他人告诉我,我应该接受它并放弃主语动词协议并使用isStoresOpen, isDogsCute, isCatsFuzzy

无论如何,对于在复数主题上操作的布尔吸气剂,我应该怎么做?

4

12 回答 12

122

拥有足够体面的英语并遵循 Java 标准怎么样:

isEveryStoreOpen()或者isEachCatCute()

当对正确的词有疑问时,我总是喜欢查询词库。

于 2014-03-14T06:47:18.583 回答
64

我不记得这是出自哪本书,但本质是代码的阅读次数比编写次数要多得多。为了可读性而写。

于 2012-10-18T17:47:48.940 回答
37

约定是在 getter 方法前面加上“is”而不是变量本身。

例如

private boolean enabled;

public boolean isEnabled() {
    return enabled;
}

private boolean storesOpen;

public boolean isStoresOpen() {
    return storesOpen;
}

isStoresOpen() 在英语中没有意义。

它在语法上可能没有意义,但它遵循约定并且看起来足够可读。

于 2012-10-18T17:46:40.107 回答
19

Java Bean 规范说要使用getgetter,除非它是booleanthen use isare是非标准的,不会被任何期望标准 Bean 命名的东西识别。

于 2012-10-18T18:07:13.527 回答
17

许多工具期望isget不太可能识别are.

尝试改写它们,例如getDogsAreFuzzy()getStoresAreOpen()或类似的东西,以获得更好的兼容性和约定。

于 2012-10-18T17:47:32.070 回答
6

你用什么编码,英语还是Java

当我阅读 Java 代码时,我希望事情是结构化的。布尔方法开头is是一个很好的结构。

return 0; 
于 2012-10-25T08:09:47.370 回答
4

-isEnabled()可以写成getEnabled().Java naming conventions

-遵循命名约定只是一个好习惯,在您使用Java Beans.

于 2012-10-18T17:46:51.947 回答
3

一般来说,我认为代码应该尽可能易于阅读,以便方法几乎可以作为一个段落来阅读(正如 所支持的那样Clean Code)。因此,我将尽可能轻松地命名为发音/阅读的方法,并遵循are. get使用现代 IDE,无需专门查找/即可轻松找到方法is

然而,库马尔对豆类提出了一个很好的观点。很多工具只会寻找get/ is。在那种情况下,我可能会考虑两种方法。一种便于阅读,一种用于工具使用。

于 2012-10-18T17:47:27.157 回答
3

在您的问题中,您明确询问了吸气剂。getter 返回有关您的类的一个实例的一些信息。例如,您有一个类Store。现在,isStoreOpen对于 getter 来说,这是一个非常好的方法名称。

接下来,您提到了一种检查所有商店是否都营业的方法。这个方法根本不是一个 getter,因为它不返回关于一个实例的信息,而是返回所有实例的信息。当然除非有类Stores。如果是这种情况,您应该重新考虑您的设计,因为 Java 已经有存储大量实例的方法,例如数组或集合,因此您不必编写额外的类。

如果不是这种情况,那么这个方法名称就很好了。另一种选择可能只是allStoresOpen没有“是”。

TL;DR:如果您要处理多个实例,则它不是吸气剂。如果是,你的设计很糟糕。

于 2012-10-18T19:12:29.290 回答
2

老实说,我会说绝对忘记are*并坚持使用is*. 将 the"is"视为变量的含义,并尽可能取一个更好的名称。

我想说 isStoresOpen 听起来还不错,但是如果听起来更适合您,您可以制作 isStoresAreOpen 。

但我的总体想法是遵守约定。它对 getter 使用“get”,对布尔类型使用“is”。我个人认为使用“is”有时已经存在问题。是的 - 它在“if”条件下看起来确实不错,但有时我只是在编码时写“get”并检查下拉列表中我需要的变量并开始想知道什么是错的以及为什么我找不到它,然后我意识到它以“是”开头...

于 2016-04-11T13:38:49.710 回答
1

在面向对象的编程中,这应该很少发生,如果有的话,因为你应该是一个单独的类,有它自己的或Store方法。如果您有更高的类型,请考虑分解到您实际使用的更原子级别。一般来说,对象在最低级别不应该是复数。CatisOpen()isFuzzy()

于 2012-10-18T17:48:53.150 回答
1

这个 StoresOpen 中的isStoresOpen()似乎是复数,

当您遵循 Java 命名约定和 Java Beans 标准时,它们为布尔值和其他类型预定义了前缀,因此您应该遵循 Java Beans 命名约定。

让我们来谈谈你的观点当你看到storesOpen在英语中,是的,它看起来像复数。再次深入观察那个词,

这里

根据英语语法,storesOpen是复数,

isStoresOpen的结果不是复数,而是单数,或者您可以说它是编程约定的标量。

它的出来是布尔值,只是真或假

不像你的英语复数陈述true's or false's

不是truefalse的数组,也不是truefalse的集合

所以,在这里我们可以说,这里我们关心的是从该布尔 bean 方法返回的值,而不是赋予类属性以指向现实世界实体的名称。

更重要的一点是,每当在类中使用此类布尔属性并且任何框架中的预定义库使用这些属性时,使用前缀 ' is ' 的框架用于检索布尔值,

为什么意味着它并不比你更聪明,因为你知道复数/单数,多路复用器等英语语法......

于 2017-06-09T10:36:43.097 回答