L'opérateur add de la classe set renvoie un booléen qui est vrai si l'élément (qui doit être ajouté) n'était pas déjà là, et faux sinon. Est en train d'écrire
if (set.add(entry)) {
//do some more stuff
}
considéré comme un bon style en termes d'écriture de code propre? Je me demande puisque vous faites deux choses à la fois. 1) ajouter l'élément et 2) vérifier si l'élément existait.
java
coding-style
clean-code
Andreas Braun
la source
la source
java.util.Set
, qui revient vraiadd
lorsque l'élément n'était pas déjà là, non?if (!set.add(entry)) {// entry already present, possibly a case you want to handle}
Réponses:
Oui, ça l'est.
Le point habituel pour qu'une opération retourne une valeur booléenne est que vous pouvez l'utiliser pour prendre des décisions, c'est-à-dire dans une
if
construction. La seule autre façon de réaliser ce potentiel serait de stocker la valeur de retour dans une variable, puis de la réutiliser immédiatement dans unif
, ce qui est tout simplement idiot et certainement pas préférable à l'écritureif(operation()) { ... }
. Alors allez-y et faites-le, nous ne vous jugerons pas (pour cela).la source
Set.add
tant qu'opération unique sans nommer d'alternative. Si l'opération envisagée consiste à ajouter un seul élément et à savoir s'il a été ajouté, il n'y a pas besoin d'une alternative plus puissante qui complique encore l'opération sans bénéfice. J'espère que vous savez queSet.add
c'est une méthode JRE intégrée qui peut être utilisée sans étudier d'abord un livre de> 700 pages.Je dirais que ce n'est pas aussi propre que possible, car cela oblige le responsable à déjà savoir ou à rechercher ce que signifie la valeur de retour. Cela signifie-t-il que la valeur existait déjà, n'existait pas déjà, a été insérée avec succès? Si vous ne l'utilisez pas beaucoup, vous ne le saurez pas, et même si vous le faites, c'est beaucoup plus de charge mentale.
Je préférerais ce qui suit:
Oui, un peu plus verbeux, mais le compilateur devrait générer à peu près exactement le même bytecode, et même les personnes qui n'ont pas utilisé les ensembles Java depuis des années peuvent suivre la logique sans rien rechercher.
la source
add
renvoie true si l'élément n'était pas déjà là, pas s'il l'était. (Le libellé de la question est trompeur.)Set.add
, vous êtes inexpérimenté et vous devriez chercher ces méthodes pour les apprendre et devenir plus expérimentées.notAlreadyPresent
n'est pas la meilleure formulation. J'utiliseraisadded
et m'attendrais à ce que le lecteur sache pourquoi une valeur ne serait pas ajoutée à un ensemble.Si true signifie succès, alors c'est un bon code clair.
Il existe une convention répandue selon laquelle une fonction ou une méthode renvoie true (ou quelque chose qui s'évalue à true) en cas de succès. Tant que votre code suit cela, je pense que mettre la méthode au conditionnel est très bien.
Un code comme celui-ci est inutilement encombré à mon avis:
C'est comme si vous vous répétiez.
Cependant, la question est ambiguë sur la signification de la valeur de retour. Vous dites "un booléen qui indique si l'élément ajouté existait déjà", ce qui pourrait impliquer que true signifie que l'élément existait (et que l'ajout ne s'est pas produit). Si tel est le cas, je changerais idéalement le comportement de retour de la méthode pour être plus conventionnel. Si ce n'est pas possible, j'ajouterais une variable intermédiaire supplémentaire qui vous permet d'étiqueter clairement le résultat du retour dans votre code (comme suggéré par d'autres).
la source
false
signifie que l'élément n'a pas été ajouté car il était déjà contenu ettrue
signifie que l'élément n'était pas déjà contenu. Commeadd()
ajoute l'élément à l'ensemble si l'ensemble ne le contient pas déjà,true
cela signifie donc que l'élément a été ajouté avec succès à l'ensemble.add
réussit sans rien faire. Si l'élément n'était pas déjà dans l'ensemble,add
réussit en ajoutant l'élément à l'ensemble. Quelle interprétation est correcte est arbitraire. La définition moins arbitraire du succès est celle du langage: la méthode réussit si elle revient normalement.firstLessThanSecond(int l, int r)
, et il retournetrue
sil > r
oufalse
sil <= r
, alors cette méthode est pas réussie, même si elle retourne normalement.add
est une abréviation grave du contrat. La documentation commence par "Ajoute l'élément spécifié à cet ensemble s'il n'est pas déjà présent", qui vérifie si l'élément était déjà dans l'ensemble. Vous êtes libre d'interpréter la valeur de retour comme vous le souhaitez, mais en fin de compte, c'est juste votre interprétation. Et dans votre deuxième exemple, la méthode évalue si une condition est vraie. Si la condition est fausse, la méthode n'a certainement pas échoué, car elle a réussi à évaluer le conditionnel.Je dirais que c'est très semblable à C. La plupart du temps, je préférerais avoir une variable nommée de manière descriptive pour un résultat de mutation, et aucune mutation ne se produisant dans une
if
condition.Un compilateur éliminera cette variable si elle est immédiatement réutilisée. Un humain aura plus de facilité à lire la source; pour moi, c'est plus important.
Si quelqu'un doit étendre la condition en ajoutant une clause
and
/or
à la condition if, il peut finir par ne pas appeler.add()
dans certains cas en raison d'une évaluation de court-circuit. Sauf si un court-circuit est spécifiquement prévu, cela peut devenir un bogue.la source
if (set.contains(entry)){set.add(entry); //do more stuff}
est-ce aussi éliminé par le compilateur?contains
etadd
. En outre, il effectue un double travail de rechercheentry
dans l'ensemble; cela peut jouer un rôle pour les très grands ensembles et les boucles très légères.if (set.contains(entry)){set.add(entry); //do more stuff}
mais plutôt aller avec, par exemple, la réponse de Karl Bielefeldt?Votre code semble rompre la séparation des requêtes de commande . Ceci est discuté dans le livre Clean Code et la vidéo Function Structure . Du point de vue du Clean Code, je pense que ce n'est pas considéré comme un bon style.
Pour moi, l'intention de votre code n'est pas claire. Est-ce que si les deux sont exécutés lorsque l'entrée est ajoutée avec succès, ou aussi quand elle existe déjà? Que
add()
revient-il? l'article? Le code d'erreur?la source
if (set.contains(entry)){set.add(entry); //do more stuff}
ce qui semble un peu idiot. Quel est votre avis là-dessus?Collection
API.