81 votes

Est-il mauvais de comparer explicitement avec les constantes booléennes, par exemple si (b == faux) en Java?

Est-ce mauvais pour écrire:

if (b == false) //...

while (b != true) //...

Est-il toujours mieux au lieu d'écrire:

if (!b) //...

while (!b) //...

Sans doute il n'y a aucune différence dans les performances (ou est-il?), mais comment voulez-vous peser la clarté, la concision, la clarté, la lisibilité, etc entre les deux?

Mise à jour

Afin de limiter la subjectivité, je voudrais aussi apprécier toutes les citations d'autorité style de codage des lignes directrices sur ce qui est toujours préférable, ou à utiliser lors de l'.


Remarque: le nom de la variable b est juste utilisé comme un exemple, ala foo et bar.

73voto

BalusC Points 498232

Ce n'est pas forcément mauvais, c'est juste inutile. Aussi, le nom de la variable de poids beaucoup. Je préfère par exemple if (userIsAllowedToLogin) - dessus if (b) , ou pire, if (flag).

Pour le souci de performances, le compilateur optimise loin à n'importe quel moyen.

Mise à jour: comme pour les sources, je ne peux pas trouver quelque chose de manière explicite dans le Soleil des Conventions de Codage, mais au moins, Checkstyle a un SimplifyBooleanExpression module qui souhaite mettre en garde à ce sujet.

51voto

Thomas Points 42973

Vous ne devez pas utiliser le premier style. J'ai vu des gens utiliser:

  • if ( b == true )
  • if ( b == false )

Personnellement, je trouve ça dur à lire, mais c'est passable. Cependant, un gros problème que j'ai avec ce style, c'est qu'il conduit à la plus contre-intuitive, les exemples que vous nous avez montré:

  • if ( b != true )
  • if ( b != false )

Qui prend plus d'effort de la part du lecteur pour déterminer les auteurs de l'intention. Personnellement, je la trouve notamment une comparaison explicite à true ou à false pour être redondants et donc plus difficile à lire, mais c'est moi.

37voto

Cela est une question de goût.

Personnellement, j'ai trouvé qu' if (!a) { , c'est beaucoup moins lisible qu' if (a == false) { , et donc plus enclins à faire des erreurs lors de l'entretien le code par la suite, et j'ai converti pour utiliser la dernière forme.

Fondamentalement, je n'aime pas le choix de symboles pour les opérations logiques plutôt que des mots (C contre Pascal), parce que pour moi, a = 10 and not b = 20 lit plus facile que d' a == 10 && !(b==20), mais c'est la façon dont il est en Java.

Quelqu'un qui met de l' "== false" approche en faveur de "!" de toute évidence, n'a jamais eu fixa code pendant trop longtemps et n'a pas pu point d'exclamation. Oui, vous pouvez obtenir le code aveugle.

27voto

Alan Moore Points 39365

La principale raison pourquoi vous ne devriez pas utiliser le premier style est parce que ces deux sont valides:

if (b = false) //...

while (b = true) //...

C'est, si vous avez accidentellement laisser un personnage, vous créez une affectation au lieu d'une comparaison. Une expression d'affectation est évaluée à la valeur qui lui a été attribué, de sorte que la première déclaration ci-dessus affecte la valeur false de b et évalue false. La seconde attribue true de b, de sorte qu'il donne toujours la valeur true, peu importe ce que vous faites avec b à l'intérieur de la boucle.

13voto

Michael Mrozek Points 44120

Je n'ai jamais vu le premier sauf en code écrit par des débutants; c'est toujours le dernier, et je ne pense pas que quiconque est vraiment dérouté par cela. D'autre part, je pense

 int x;
...
if(x) //...
 

contre

 if(x != 0) //...
 

est beaucoup plus discutable, et dans ce cas, je préfère la deuxième

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X