Conventions de dénomination pour les méthodes java qui renvoient booléen (pas de point d'interrogation)

94

J'aime utiliser le point d'interrogation à la fin des noms de méthode / fonction dans d'autres langues. Java ne me laisse pas faire ça. Pour contourner ce problème, comment puis-je nommer des méthodes de retour booléennes en Java? L' utilisation d' un is, has, should, canà l'avant d'un son de méthode acceptable pour certains cas. Existe-t-il une meilleure façon de nommer ces méthodes?

Par exemple, createFreshSnapshot?

Letronje
la source
2
Quelle langue autorise un ?dans un nom de méthode?
SLaks
11
@SLaks, Scheme, Ruby ...
Skilldrick
dans le schéma, nous mettons toujours un pà la fin du nom de la méthode
Erick Robertson
@Erick: pas toujours, mais "p" est un moyen standard de désigner les prédicats
Jason S
nous = ma classe de programme de premier cycle l'a toujours fait. Je n'utiliserais jamais cette convention en Java.
Erick Robertson

Réponses:

122

La convention est de poser une question dans le nom.

Voici quelques exemples que l'on peut trouver dans le JDK:

isEmpty()

hasChildren()

De cette façon, les noms sont lus comme s'ils auraient un point d'interrogation à la fin.

La collection est-elle vide?
Ce nœud a-t-il des enfants?

Et, alors, truesignifie oui, et falsesignifie non.

Ou, vous pouvez le lire comme une assertion:

La collection est vide.
Le nœud a des enfants

Remarque:
Parfois, vous voudrez peut-être nommer une méthode quelque chose comme createFreshSnapshot?. Sans le point d'interrogation, le nom implique que la méthode doit créer un instantané, au lieu de vérifier si un est nécessaire.

Dans ce cas, vous devez repenser ce que vous demandez réellement. Quelque chose comme isSnapshotExpiredest un nom bien meilleur, et transmet ce que la méthode vous dira lorsqu'elle sera appelée. Suivre un modèle comme celui-ci peut également aider à garder plus de fonctions pures et sans effets secondaires.

Si vous faites une recherche Google pour isEmpty()l'API Java, vous obtenez beaucoup de résultats.

jjnguy
la source
qu'en est-il de createFreshSnapshot?
letronje
4
@letr, eh bien, je le renommerais probablement allumé isSnapshotExpiredou quelque chose comme ça. (basé sur vos critères)
jjnguy
8
Je contourne le problème 'createFrshSnapshot' en utilisant le mot 'should' - c'est-à-dire "shouldCreateFreshSnapshot ()" (bien que dans ce cas isSnapshotExpired () soit meilleur)
DJClayworth
1
Je vérifie si les messages de pulsation doivent être envoyés avec une shouldHeartbeat()méthode.
Erick Robertson
Pourquoi penser cela isEmpty()et hasChildren()sont des questions et non des affirmations ? Il se lit en fait un peu mieux en anglais si vous considérez ces noms comme des assertions ou des prédicats.
rick
29

Si vous souhaitez que votre classe soit compatible avec la spécification Java Beans , de sorte que les outils utilisant la réflexion (par exemple JavaBuilders , JGoodies Binding ) puissent reconnaître les getters booléens, soit utiliser getXXXX()soit isXXXX()un nom de méthode. À partir de la spécification Java Beans:

8.3.2 Propriétés booléennes

De plus, pour les propriétés booléennes, nous autorisons une méthode getter à correspondre au modèle:

public boolean is< PropertyName > ();

Cette méthode «is < PropertyName >» peut être fournie à la place d'une méthode «get < PropertyName >», ou elle peut être fournie en plus d'une méthode «get < PropertyName >». Dans les deux cas, si la méthode «is < PropertyName >» est présente pour une propriété booléenne, nous utiliserons la méthode «is < PropertyName >» pour lire la valeur de la propriété. Un exemple de propriété booléenne pourrait être:

public boolean isMarsupial();
public void setMarsupial(boolean m);
Jason S
la source
C'est déroutant quand vous dites que public boolean is<PropertyName>(); ça ressemble à un générique.
Erick Robertson
Hé, je cite juste les spécifications. Je vais mettre en italique selon les spécifications.
Jason S
4
Je me fiche de la compatibilité des beans Java, je veux juste que les noms de mes méthodes sonnent bien :)
letronje
4
Même si vous ne vous souciez pas de la compatibilité des Javabeans, la convention de dénomination vaut la peine d'être suivie, car elle s'est développée bien au-delà de la portée d'origine des «beans» configurés dans les IDE. Par exemple, si vous utilisez isEmpty comme nom de méthode, vous pouvez appeler cette méthode à partir de JSP en utilisant object.empty, mais vous ne pouvez pas appeler de méthodes avec d'autres préfixes, vous ne pouvez donc pas utiliser object.children pour appeler object.hasChildren (). Ainsi, JSP et EL (Expression Language) vous permettent d'accéder aux propriétés Javabeans. Une grande victoire si vous me demandez.
Stijn de Witt
JavaBeans est très spécifique, merci de le rappeler. Je me demande souvent et j'ai tendance à penser que je suis coincé avec le préfixe «est», mais pas du tout en effet.
Snicolas
26

Je souhaite publier ce lien car cela peut aider davantage les personnes qui vérifient cette réponse et recherchent plus de convention de style java

Instructions de style de programmation Java

L'élément "2.13 est le préfixe doit être utilisé pour les variables et méthodes booléennes." est spécifiquement pertinent et suggère le préfixe is .

Le guide de style continue en suggérant:

Il existe quelques alternatives au préfixe is qui s'adaptent mieux dans certaines situations. Ce sont les préfixes has , can et should :

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

Si vous suivez les directives, je pense que la méthode appropriée serait nommée:

shouldCreateFreshSnapshot()
kommradHomer
la source
2
Pour votre information, ces directives sont protégées par copyright Geotechnical Software Services. Cela dit, ils ont référencé la source en bas pour suggérer qu'ils sont légitimes.
Donal Lafferty
11

Pour les méthodes qui peuvent échouer, c'est-à-dire que vous spécifiez booléen comme type de retour, j'utiliserais le préfixe try:

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

Pour tous les autres cas, utilisez des préfixes comme is.. has.. was.. can.. allows....

codymanix
la source
15
Mais try ne signifie pas que c'est une question (a une valeur de retour).
Steve Kuo
Ne renvoyez jamais de valeur booléenne pour indiquer si une méthode a échoué ou non. Si la méthode a échoué, lancez une exception. Imaginez que la méthode a échoué et que vous obtenez un faux, comment déterminez-vous ce qui n'a pas fonctionné exactement?
Wouter van Koppen
5

La norme est d'utiliser «est» ou «a» comme préfixe. Par exemple isValid, hasChildren.

BillThor
la source
2

isest celui que j'ai rencontré plus que tout autre. Ce qui a du sens dans la situation actuelle est cependant la meilleure option.

Skilldrick
la source
0

Je veux montrer un point de vue différent sur cette convention de dénomination générale , par exemple:

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

où la justification est:

effectuez un traitement puis indiquez s'il a réussi ou non .

Alors que le returnest en effet un, booleanle nom de la méthode doit pointer le traitement à terminer au lieu du type de résultat (booléen pour cet exemple).

Votre createFreshSnapshotexemple me semble plus lié à ce point de vue car il semble vouloir dire ceci: créez un instantané frais puis indiquez si l'opération de création a réussi. Compte tenu de ce raisonnement, le nom createFreshSnapshotsemble être le meilleur pour votre situation.

adrhc
la source
1
Je ne sais pas pourquoi vous êtes défavorisé, je suis d'accord. Même si j'évite de l'utiliser, car ce n'est pas du tout sémantique, c'est une convention utilisée par de nombreuses API Java internes.
Kamil Bęben
1
Je suppose que parce qu'au départ, j'ai seulement écrit "Set: boolean add (E e)", donc les gens n'ont pas remarqué qu'il s'agissait du java.util.Set bien connu; ou peut-être parce que mon anglais est si mauvais: D. Merci pour le vote positif :)
adrhc