Java布尔型吸气剂“是”与“是”


90

我知道Java中布尔获取器的约定包括前缀“ is”。

isEnabled
isStoreOpen

但是,如果主题是复数呢?也就是说,如果我不想知道某个商店是否已营业,而是想知道所有商店是否已营业怎么办?

isStoresOpen() 用英语没有意义。

我很想写这样的getter:

areStoresOpen
areDogsCute
areCatsFuzzy

我认为这是有意义的,但我一直在别人告诉我,我应该只是吮吸它,抛弃主题动词协议和使用isStoresOpenisDogsCuteisCatsFuzzy

无论如何,对于在复数主题上运算的布尔型吸气剂,我该怎么办?


3
我在are*()吸气剂之前从未见过。
10/18的

21
are*()如果语法正确,我总是写getter。
冰冻豌豆罗迪(Roddy of the Frozen Peas)

2
如果您的对象是豆子,我认为您必须坚持使用ishas...
assylias 2012年

4
我认为,如果您使用的是are *()getter,那么在大多数情况下它应该返回boolean []。
Juvanis

2
很好的问题。我本人对此很纳闷。正如许多答案所指出的那样,大多数框架,IDE以及所有依赖于我所遇到的约定的东西都使用“ get” /“ set” /“ is”模式。即使这不是您的应用程序中要考虑的问题,无论如何我都会遵循该约定-如果您保持一致的命名约定(即使有时听起来在语法上并不奇怪),您的代码也将更容易遵循(甚至由您执行) )。
保罗·里希特

Answers:


57

我不记得这是哪本书,但是本质是代码被读取的次数比编写的要多。编写以提高可读性。


20
清洁法规-罗伯特·马丁
约翰·B

8
但是要非常小心,不要走得太远。 storesAreOpen()可能是最语法的(因为if(storesAreOpen())),但是名称的布尔部分现在隐藏在方法名称的中间,这破坏了Java约定可读代码。
Izkata 2012年

108
我不明白这是如何接受的答案。它甚至没有提供对该问题的明确答案。
Tamzin Blake

3
他以非常笼统的方式回答了这个问题。的确,他没有说明细节,但这是一个答案。它看起来似乎很陈旧,但确实有价值(至少有24个人这样认为)。
乔治·斯托克

4
为了澄清答案,我要补充一点,即areStoresOpen()是一个不错的选择。
kiedysktos '16

94

如何拥有足够体面的英语并遵循Java标准:

isEveryStoreOpen() 要么 isEachCatCute()

当对正确的词有疑问时,我总是喜欢上同义词库。


18
+1,这清楚地传达了返回值的含义,即isEveryStoreOpen()或isAnyStoreOpen()不同于歧义的isStoresOpen()。
Imre 2015年

4
+1这应该是公认的答案!保持Java booleanis前缀约定在语法上有意义。另外,它提供了一些额外的信息,这些信息对于那些恰巧是代码库维护人员的非英语母语者来说将非常有用。
higuaro '18 -10-7

这个答案改变了我的生活!它应该是公认的答案。
马塞尔·布兰克

34

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

例如

private boolean enabled;

public boolean isEnabled() {
    return enabled;
}

private boolean storesOpen;

public boolean isStoresOpen() {
    return storesOpen;
}

isStoresOpen()用英语没有意义。

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


您的回答是有道理的,我对此表示赞赏。我认为从权威的对/错位置来看,您是对的。我只是不想有一个旨在通过明显,清晰和易于理解而放弃我们的目的,以便遵守其规则的约定,以帮助我们。但是,您是对的,这就是我的要求。
kodai 2012年

@kodai:我认为不应将其视为规则,而应视为惯例。但是我相信,如果不需要这样做,则不遵循惯例编写代码是可以的。
Bhesh Gurung

18

Java Bean规范说要get用于getter,除非它是booleanthen use isare是非标准的,并且不会被期望使用标准Bean命名的任何内容所识别。


17

许多工具期望isget不可能意识到are

尝试改写它们,例如getDogsAreFuzzy()getStoresAreOpen(),以便更好的兼容性和约定。


是。像豆实用工具软件指望这个词找到布尔干将。
2012年

4

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

-遵循命名约定只是一个好习惯,在使用时会有所帮助Java Beans


3

总的来说,我认为代码应尽可能易于阅读,这样一种方法几乎可以看作是一个段落(由拥护Clean Code)。因此,我将命名为听起来/阅读尽可能容易的方法,并遵循的语法规则are。使用现代IDE,无需专门查找get/ 即可轻松找到方法is

但是,库玛(Kumar)很好地介绍了豆类。很多工具只会寻找get/ is。在这种情况下,我可能会考虑同时使用两种方法。一种是易于阅读的,一种是用于工具的。


3

您使用什么语言书写:英语Java

当我阅读Java代码时,我希望事情早已存在,让我搜索带有isare前缀的两个getter 会比仅搜索一个前缀更加复杂。

但是从另一方面来说,当我早上看报纸时,我什么也没找,所以您可以用更传统的英语写作。

返回0;


3

在您的问题中,您明确地询问吸气剂。获取器返回有关类的一个实例的一些信息。例如,您有一堂课Store。现在,这isStoreOpen是一个非常好的方法名称。

接下来,您提到一种检查所有商店是否都打开的方法。该方法根本不是一个吸气剂,因为它不返回有关一个实例的信息,而是返回所有实例的信息。当然,除非有一堂课Stores。在这种情况下,您应该重新考虑您的设计,因为Java已经可以存储许多实例,例如数组或集合,因此您不必编写额外的类。

如果不是这种情况,则此方法名称非常合适。另一种选择可能就是allStoresOpen没有“ is”。

TL; DR:如果要处理多个实例,那不是一个吸气剂。如果是这样,则说明您的设计不好。


2

老实说我绝对会忘记are*并坚持下去is*。请将"is"视为变量的含义,并在可能的情况下使用更好的名称。

我要说的是isStoresOpen听起来并不那么糟糕,但是如果听起来更适合您,则可以使isStoresAreOpen成为可能。

但是我的一般想法是遵守约定。哪个将“ get”用于吸气剂,将“ is”用于布尔类型。我个人认为使用“ is”有时已经有问题。是的-它在“如果”条件下看起来确实不错,但是有时我在编码时只写“ get”并检查所需变量的下拉列表,然后开始想知道哪里出了问题以及为什么我找不到它,然后我意识到了以“ is”开头...


1

在面向对象的编程中,这种情况很少(如果有的话)发生,因为StoreCat您应该将其作为单独的类,使用其自己的isOpen()isFuzzy()方法。如果您使用更高的类型,请考虑分解到实际使用的更多原子级别。通常,最低级别的对象不应为复数。


1

这个StoresOpen中的isStoresOpen()看起来像是复数,

当您遵循该Java命名约定和Java Beans标准时,它们具有boolean和其他类型的预定义前缀,因此您应遵循Java Beans命名约定。

让我们指出您的意思当您看到storeOpen就像英语中的准术语一样,是的,看起来像是复数形式。再一次深入观察这个词,

这里

storesOpen根据英语语法为复数形式,

该出的来的isStoresOpen并不多,而不是是单数还是你可以说这是在编程约定的条款标。

出来的是布尔值,是对还是错

不像您的英文复数陈述

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

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

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

为什么意味着它不如您所知道的那么聪明,因为您知道英语语法,例如复数/单数,多路复用器等。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.