Convenções de nomenclatura para métodos java que retornam booleano (sem ponto de interrogação)

93

Gosto de usar pontos de interrogação no final dos nomes de métodos / funções em outras línguas. Java não me deixa fazer isso. Como solução alternativa, de que outra forma posso nomear métodos de retorno booleanos em Java? Usando um is, has, should, canna frente de um som método bom para alguns casos. Existe uma maneira melhor de nomear esses métodos?

Por exemplo, createFreshSnapshot?

Letronje
fonte
2
Qual linguagem permite um ?em um nome de método?
SLaks
11
@SLaks, Scheme, Ruby ...
Skilldrick,
no esquema, sempre colocamos um pno final do nome do método
Erick Robertson
@Erick: nem sempre, mas "p" é uma forma padrão de designar predicados
Jason S
nós = minha classe de regime de graduação sempre fez. Eu nunca usaria essa convenção em Java.
Erick Robertson,

Respostas:

121

A convenção é fazer uma pergunta em nome.

Aqui estão alguns exemplos que podem ser encontrados no JDK:

isEmpty()

hasChildren()

Dessa forma, os nomes são lidos como se tivessem um ponto de interrogação no final.

A coleção está vazia?
Este Nodo tem filhos?

E, então, truesignifica sim e falsesignifica não.

Ou você pode ler como uma afirmação:

A coleção está vazia.
O nó tem filhos

Nota:
Às vezes, você pode querer nomear um método de forma semelhante createFreshSnapshot?. Sem o ponto de interrogação, o nome indica que o método deve criar um instantâneo, em vez de verificar se um é necessário.

Nesse caso, você deve repensar o que está realmente pedindo. Algo como isSnapshotExpiredé um nome muito melhor e transmite o que o método dirá quando for chamado. Seguir um padrão como esse também pode ajudar a manter mais puras de suas funções e sem efeitos colaterais.

Se você fizer uma Pesquisa Google por isEmpty()na API Java, obterá muitos resultados.

jjnguy
fonte
e quanto a createFreshSnapshot?
letronje,
4
@letr, bem, provavelmente eu o renomearia como iluminado isSnapshotExpiredou algo parecido. (com base em seus critérios)
jjnguy
8
Contorno o problema 'createFrshSnapshot' usando a palavra 'deveria' - isto é, "shouldCreateFreshSnapshot ()" (embora neste caso isSnapshotExpired () seja melhor)
DJClayworth
1
Eu verifico se as mensagens de pulsação devem ser enviadas com um shouldHeartbeat()método.
Erick Robertson,
Por que pensar isso isEmpty()e hasChildren()são perguntas , e não afirmações ? Na verdade, a leitura é um pouco melhor em inglês se você pensar nesses nomes como afirmações ou predicados.
rick
29

Se desejar sua classe para ser compatível com a especificação Java Beans , de modo que as ferramentas que utiliza a reflexão (por exemplo JavaBuilders , JGoodies de ligação ) pode reconhecer boolean getters, tanto para uso getXXXX()ou isXXXX()como um nome de método. Da especificação Java Beans:

8.3.2 Propriedades booleanas

Além disso, para propriedades booleanas, permitimos um método getter para corresponder ao padrão:

public boolean is< PropertyName > ();

Este método “is < PropertyName >” pode ser fornecido em vez de um método “get < PropertyName >”, ou pode ser fornecido além de um método “get < PropertyName >”. Em ambos os casos, se o método “is < PropertyName >” estiver presente para uma propriedade booleana, usaremos o método “is < PropertyName >” para ler o valor da propriedade. Um exemplo de propriedade booleana pode ser:

public boolean isMarsupial();
public void setMarsupial(boolean m);
Jason S
fonte
É confuso quando você diz public boolean is<PropertyName>(); Parece um genérico.
Erick Robertson,
Ei, estou apenas citando a especificação. Vou colocar em itálico de acordo com as especificações.
Jason S,
4
Não me importo com a compatibilidade de Java beans, só quero que os nomes dos meus métodos soem bem :)
letronje
4
Mesmo que você não se importe com a compatibilidade de Javabeans, vale a pena seguir a convenção de nomenclatura, porque ela cresceu muito além do escopo original de 'beans' configurados em IDE. Por exemplo, se você usar isEmpty como nome do método, poderá chamar esse método de JSP usando object.empty, no entanto, não pode chamar métodos com outros prefixos, portanto, não pode usar object.children para chamar object.hasChildren (). Assim, JSP e EL (Expression Language) permitem que você acesse as propriedades Javabeans. Uma grande vitória se você me perguntar.
Stijn de Witt
JavaBeans é muito específico, obrigado por lembrar disso. Muitas vezes me pergunto e tenho a tendência de pensar que estou preso ao prefixo 'é', mas não estou mesmo.
Snicolas
26

Quero postar este link, pois pode ajudar ainda mais para aqueles que verificam esta resposta e procuram mais convenções de estilo java

Diretrizes de estilo de programação Java

O item "2.13 is prefix deve ser usado para variáveis ​​e métodos booleanos." é especificamente relevante e sugere o prefixo is .

O guia de estilo sugere:

Existem algumas alternativas para o prefixo is que se adaptam melhor em algumas situações. Estes são os prefixos tem , pode e deve :

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

Se você seguir as Diretrizes, acredito que o método apropriado seria nomeado:

shouldCreateFreshSnapshot()
kommradHomer
fonte
2
Para sua informação, existem diretrizes com direitos autorais sobre Serviços de Software Geotécnico. Dito isso, eles referenciaram a fonte na parte inferior para sugerir que são legítimos.
Donal Lafferty
11

Para métodos que podem falhar, ou seja, você especifica booleano como tipo de retorno, eu usaria o prefixo try:

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

Para todos os outros casos, use prefixos como is.. has.. was.. can.. allows....

codymanix
fonte
15
Mas tentar não transmite que é uma pergunta (tem um valor de retorno).
Steve Kuo,
Nunca retorne um booleano para indicar se um método falhou ou não. Se o método falhar, lance uma exceção. Imagine que o método falhou e você obteve um falso, como você determinaria o que exatamente deu errado?
Wouter van Koppen
5

O padrão é usar 'é' ou 'tem' como prefixo. Por exemplo isValid, hasChildren.

BillThor
fonte
2

isé o que eu encontrei mais do que qualquer outro. O que quer que faça sentido na situação atual é a melhor opção.

Skilldrick
fonte
0

Quero apontar uma visão diferente sobre esta convenção geral de nomenclatura, por exemplo:

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

onde a justificativa é:

fazer algum processamento e relatar se foi bem-sucedido ou não .

Embora returnseja realmente um, booleano nome do método deve apontar o processamento para ser concluído em vez do tipo de resultado (booleano neste exemplo).

Seu createFreshSnapshotexemplo me parece mais relacionado a este ponto de vista porque parece significar o seguinte: crie um instantâneo fresco e depois relate se a operação de criação foi bem-sucedida. Diante desse raciocínio, o nome createFreshSnapshotparece ser o mais adequado para sua situação.

adrhc
fonte
1
Não sei por que você está sendo rejeitado, concordo. Mesmo que eu evite usá-lo, porque não é semântico, é uma convenção usada por muitas APIs Java internas.
Kamil Bęben
1
Acho que porque inicialmente eu escrevi apenas "Set: boolean add (E e)" então as pessoas não perceberam que é sobre o conhecido java.util.Set; ou talvez porque meu inglês seja tão ruim: D. Obrigado pelo
voto positivo