Getters booleanos Java “é” vs “são”

90

Eu sei que a convenção em Java para getters booleanos é incluir o prefixo "é".

isEnabled
isStoreOpen

Mas e se o sujeito for plural? Ou seja, e se em vez de querer saber se uma loja está aberta, eu quisesse saber se todas as lojas estão abertas?

isStoresOpen() não faz sentido em inglês.

Estou tentado a escrever getters como:

areStoresOpen
areDogsCute
areCatsFuzzy

E eu acho que faria sentido, mas eu tenho dito por outros que eu deveria apenas chupa-lo e abandonar assunto verbo acordo e uso isStoresOpen, isDogsCute, isCatsFuzzy.

De qualquer forma, o que devo fazer para getters booleanos que operam em um sujeito no plural?

kodai
fonte
3
Eu nunca vi antes um are*()getter.
rekire
21
Sempre escrevo are*()getters se eles estiverem gramaticalmente corretos.
Roddy of the Frozen Peas
2
Se o seu objeto é um feijão, acho que você tem que se ater a um isou has...
assylias
4
se você estiver usando are * () getter, ele deve retornar boolean [] na maioria dos casos, eu acho.
Juvanis
2
Ótima pergunta. Me perguntei isso um pouco. Como muitas das respostas já indicaram, a maioria dos frameworks, IDEs e qualquer coisa que se baseie em uma convenção que encontrei usa o padrão "get" / "set" / "is". Mesmo que isso não seja uma preocupação em seu aplicativo, eu seguiria essa convenção de qualquer maneira - seu código será muito mais fácil de seguir (mesmo por você) se você mantiver uma convenção de nomenclatura consistente (mesmo que às vezes não pareça gramaticalmente estranho )
Paul Richter

Respostas:

57

Não me lembro de qual livro era, mas a essência é que o código será lido muito mais vezes do que escrito. Escreva para facilitar a leitura.

John
fonte
20
Clean Code - Robert Martin
John B
8
Mas tenha muito cuidado para não ir muito longe. storesAreOpen()provavelmente seria o mais gramatical (por causa de if(storesAreOpen())), mas a parte booleana do nome agora está oculta no meio do nome do método, o que quebra as convenções Java e o código legível.
Izkata 18/10/12
108
Não entendo como essa resposta é aceita. Nem mesmo fornece uma resposta definitiva para a pergunta.
Tamzin Blake
3
Ele responde à pergunta de uma maneira muito geral. É verdade que ele não aborda os detalhes, mas esta é uma resposta. Pode parecer banal, mas tem valor (pelo menos 24 pessoas pensam assim).
George Stocker
4
para esclarecer a resposta, gostaria de acrescentar a observação de que areStoresOpen () é uma boa escolha aqui.
kiedysktos
94

Que tal ter um inglês decente e seguir o padrão Java:

isEveryStoreOpen() ou isEachCatCute()

Na dúvida sobre a palavra certa, sempre gosto de pegar o dicionário de sinônimos.

satur9nine
fonte
18
+1, isso transmite claramente se o valor retornado significa isEveryStoreOpen () ou isAnyStoreOpen () ao contrário do ambíguo isStoresOpen ().
Imre
4
+1 Esta deve ser a resposta aceita! Faz sentido gramaticalmente, mantendo o Java booleans isconvenção de prefixo. Além disso, fornece um pouco de informação extra que será realmente útil para aqueles falantes não nativos de inglês que por acaso são mantenedores da base de código.
higuaro,
Essa resposta mudou minha vida! E deve ser a resposta aceita.
Marcel Blanck
34

A convenção é prefixar o método getter com "is" e não a própria variável.

por exemplo

private boolean enabled;

public boolean isEnabled() {
    return enabled;
}

e

private boolean storesOpen;

public boolean isStoresOpen() {
    return storesOpen;
}

isStoresOpen () não faz sentido em inglês.

Pode não fazer sentido gramaticalmente, mas segue a convenção e parece legível o suficiente.

Bhesh Gurung
fonte
Sua resposta faz sentido, e eu agradeço. Acho que a partir de uma posição correta / errada autorizada, você está certo. Só não quero uma convenção que pretendia nos ajudar sendo óbvia, clara e fácil de entender a abandonar esse propósito em prol do cumprimento de suas regras. Mas você está certo - é assim que as coisas são, e foi sobre isso que perguntei.
kodai
@kodai: Acho que não deve ser considerado uma regra, mas apenas uma convenção. Mas acredito que escrever código que não siga a convenção, se não for obrigatório, para torná-lo legível é o caminho a percorrer.
Bhesh Gurung
18

A especificação Java Bean diz para usar getpara getters, a menos que seja um booleanuso então is. arenão é padrão e não será reconhecido por nada que espere a nomenclatura Bean padrão.

Steve Kuo
fonte
17

Muitas ferramentas esperam isou getprovavelmente não reconhecerão are.

Tente reformulá-los, como getDogsAreFuzzy()ou getStoresAreOpen()ou coisas assim para melhor compatibilidade e convenções.

Kevin Rubin
fonte
Sim. Ferramentas como utilitários de feijão contar com a palavra é para encontrar getters booleanos.
basicamente
4

- isEnabled() também pode ser escrito como getEnabled()emJava naming conventions .

- É apenas um bom hábito seguir as convenções de nomenclatura, ajudar quando estiver trabalhando com Java Beans.

Kumar Vivek Mitra
fonte
3

Em geral, acho que o código deve ser o mais facilmente legível possível, de modo que um método quase possa ser lido como um parágrafo (conforme adotado por Clean Code). Portanto, eu nomearia o método para som / leitura tão facilmente quanto possível e seguiria a regra gramatical de are. Com IDEs modernos, é fácil encontrar métodos sem procurar especificamente por get/ is.

No entanto, Kumar faz uma boa observação sobre o feijão. Muitas ferramentas procurarão apenas get/ is. Nesse caso, posso considerar ter os dois métodos. Um para facilitar a leitura e outro para o uso da ferramenta.

John B
fonte
3

Em que idioma você escreve: Inglês ou Java ?

Quando estou lendo o código Java, espero que as coisas estejam lá, ter que procurar os dois getters, com os prefixos é e são , será mais complicado do que procurar apenas um prefixo.

Porém, por outro lado, quando leio jornal pela manhã, não procuro nada, então você pode escrever na forma mais tradicional do inglês.

return 0;

Ilya Gazman
fonte
3

Em sua pergunta, você está perguntando explicitamente sobre getters. Um getter retorna algumas informações sobre uma instância de sua classe. Por exemplo, você tem uma aula Store. Agora, isStoreOpené um nome de método perfeitamente adequado para um getter.

Em seguida, você menciona um método que verifica se todas as lojas estão abertas. Este método não é um getter, porque ele não retorna informações sobre uma instância, mas para todas. Claro, a menos que haja uma classe Stores. Se for esse o caso, você deve repensar seu design, porque Java já tem maneiras de armazenar várias instâncias, por exemplo, arrays ou coleções, então você não precisa escrever classes extras.

Se não for esse o caso, o nome do método está perfeitamente correto. Uma alternativa pode ser apenasallStoresOpen sem o 'é'.

TL; DR: se você estiver lidando com várias instâncias, não é um getter. Se for, seu design é ruim.

Kirill Rakhman
fonte
2

Sinceramente, eu diria que definitivamente esqueça o are*e continue is*. Pense em "is"como o significado da variável e crie um nome melhor, se possível.

Eu diria que isStoresOpen não soa tão ruim, mas você pode fazer isStoresAreOpen se soar melhor para você.

Mas minha ideia geral seria seguir as convenções. Que é usar "get" para getters e "is" para tipos booleanos. Pessoalmente, acho que usar "é" às vezes já é problemático. Sim - parece bom em condições "se", mas às vezes eu apenas escrevo "obter" ao codificar e verifico a lista suspensa para minha variável necessária e começo a me perguntar o que está errado e por que não consigo encontrar, então eu percebo começa com "é" ...

Arturas M
fonte
1

Em programação orientada a objetos, isso raramente, ou nunca, deve ocorrer desde Storeou Catou o que você deve ser uma classe separada, com seu próprio método isOpen()ou isFuzzy(). Se você tiver um tipo superior, considere dividir para o nível mais atômico que você está usando. Em geral, os objetos não devem ser plurais no nível mais baixo.

asteri
fonte
1

isStoresOpen () neste StoresOpen parece um plural,

Quando você segue a Convenção de Nomenclatura Java e os Padrões Java Beans, eles têm prefixos predefinidos para booleano e outro tipo, portanto, você deve seguir a Convenção de Nomenclatura Java Beans.

Vamos direto ao que você quer dizer Quando você vir as lojasOpen como um prospecto em inglês, sim, parece plural. Mais uma vez, observe profundamente essa palavra,

Aqui

storeOpen é plural de acordo com a gramática inglesa,

O resultado de isStoresOpen não é plural, ao invés disso é singular ou você pode dizer que é escalar em termos de convenção de programação.

O resultado é booleano, apenas verdadeiro ou falso

Diferente da sua afirmação plural em inglês verdadeiro ou falso

Não é uma matriz de verdadeiro ou falso , ou não uma coleção de verdadeiro ou falso

Então, aqui podemos dizer que, aqui estamos preocupados com o valor que é o retorno daquele método de bean booleano, não o nome dado à propriedade de classe para apontar entidade do mundo real.

Uma coisa mais importante é, sempre que tais propriedades booleanas são utilizados nas classes e aqueles são utilizados por bibliotecas pré-definidos em qualquer quadro, então quadro com utilização prefixo ' seja ' para a recuperação de valores booleanos,

por que significa que não é muito mais inteligente do que você, pois você conhece a gramática do inglês como plural / singular, multiplexador etc ...

Anil Kumar
fonte