N'écrivez pas de code si (isAdmin == true) en Java

introduction

Je pense que c'est naturel, mais il y a des moments où ce n'est pas protégé de façon inattendue. À titre d'exemple, prenons le traitement de booléen dans le branchement conditionnel.

~~ J'ai écrit "en Java" dans le titre, mais c'est probablement la même chose dans n'importe quelle langue. ~~ Annulez-le car il ne s'applique pas à d'autres langages tels que JavaScript [^ js].

Qu'est-ce qui ne va pas

Il y a des cas où cela est clairement nié par la norme de codage [^ 1], mais en Java, le code suivant ** ne doit pas être écrit **.

if (isAdmin == true) {
  //Quand isAdmin est vrai
}

if (isAdmin == false) {
  //Quand isAdmin est faux
}

J'écrirai trois raisons.

Raison 1: il est redondant

Le code ci-dessus peut être écrit comme suit: C'est plus simple.

if (isAdmin) {
  //Quand isAdmin est vrai
}

if (!isAdmin) {
  //Quand isAdmin est faux
}

Dans le cas de ʻif ~ else ~ `, il peut être simple d'écrire avec un opérateur ternaire. Cependant, l'abus de l'opérateur ternaire peut réduire la lisibilité. Veuillez vous référer à l'article suivant pour plus de détails.

String userType;
if (isAdmin) {
  userType = "Administrateur";
} else {
  userType = "Général";
}

//Il est plus simple d'écrire avec l'opérateur ternaire comme suit
String userType = isAdmin ? "Administrateur" : "Général";

Si c'est vrai, il n'y a pas de problème, mais s'il est faux, il y a des cas où «!» Est discret.

if (!obj.getFoo().isBar()) {
  //En traitement
}

Dans de tels cas, il est judicieux d'ajouter des variables explicatives.

boolean bar = obj.getFoo().isBar();
if (!bar) {
  //En traitement
}

Raison 2: Peut être confondu avec une affectation

En Java, il est décidé que l'instruction if doit être écrite comme un type booléen, donc l'écriture d'une affectation dans l'instruction if entraîne généralement une erreur de compilation. Cependant, dans le cas du type booléen, même si vous écrivez ce qui suit, la compilation passera sans avertissement.

if (isAdmin = true) {
  //Quand isAdmin est vrai ... doit toujours être exécuté
}

if (isAdmin = false) {
  //Quand isAdmin est faux ... il ne doit pas toujours être exécuté
}

//Cela entraînera une erreur de compilation
if (isAdmin = 1) {
}

Cependant, écrire en notation Yoda [^ yoda] comme indiqué ci-dessous est ** basculer **.

if (true == isAdmin) {
  //Quand isAdmin est vrai
}

if (false == isAdmin) {
  //Quand isAdmin est faux
}

En fait, il vous avertira avec IDE et FindBugs / SpotBugs [^ 3], donc vous ne devriez pas le remarquer, mais si vous n'écrivez pas ʻif (isAdmin == true) `depuis le début, il n'y a pas de problème.

Raison 3: lent (en théorie)

Le contenu suivant est uniquement lorsque b == true, et n'a aucun effet lorsque vous utilisez b == false ou! B. Voir les commentaires pour plus de détails.

C'est presque un aparté, mais en théorie ce serait inutile [^ 4]. Par exemple, compilez le code suivant et assemblez-le à l'envers avec javap -c.

public class Main {
    public int foo(boolean b) {
        if (b == true) {
            return 1;
        } else {
            return 0;
        }
    }

    public int bar(boolean b) {
        if (b) {
            return 1;
        } else {
            return 0;
        }
    }
}

Ensuite, vous obtiendrez la sortie suivante (à l'exclusion de la sortie non pertinente):

  public int foo(boolean);
    Code:
       0: iload_1
       1: iconst_1
       2: if_icmpne     7
       5: iconst_1
       6: ireturn
       7: iconst_0
       8: ireturn

  public int bar(boolean);
    Code:
       0: iload_1
       1: ifeq          6
       4: iconst_1
       5: ireturn
       6: iconst_0
       7: ireturn

Si vous lisez ceci, ce sera comme suit [^ 5]. Je l'ai écrit pendant longtemps, mais le fait est qu'une instruction est gaspillée.

C'est parce que ʻif (b) signifie" si b est vrai ", tandis que ʻif (b == vrai) signifie "si b est vrai par rapport à vrai". Parce que c'est devenu.

en conclusion

Certaines personnes peuvent dire: «Je m'en fiche», mais l'accumulation de ces petites choses fera une grande différence à l'avenir. Je veux que vous développiez peu à peu de bonnes habitudes.

Postscript

Il semble qu'il y ait eu une réponse, je vais donc la compléter petit à petit.

[^ 1]: [Java Coding Standards-Future Enterprise Coding Standards-Future Architect](https://future-architect.github.io/coding-standards/documents/forJava/Java%E3%82%B3%E3% 83% BC% E3% 83% 87% E3% 82% A3% E3% 83% B3% E3% 82% B0% E8% A6% 8F% E7% B4% 84.html) [^ 3]: [QBA: Méthode d'attribution d'une valeur littérale booléenne dans l'expression logique (QBA_QUESTIONABLE_BOOLEAN_ASSIGNMENT)](https://spotbugs.readthedocs.io/ja/latest/bugDescriptions.html#qba-boolean-qba-questionable -affectation-booléenne) [^ 4]: Je l'ai mesuré, mais je n'ai pas pu confirmer la différence. Donc "en théorie". [^ 5]: déduit de la Spécification de la machine virtuelle Java®. [^ yoda]: [Notation Yoda-Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%A8%E3%83%BC%E3%83%80%E8%A8%98%E6 % B3% 95) etc. [^ js]: Pour JavaScript: Opérateurs logiques --JavaScript | MDN

Recommended Posts

N'écrivez pas de code si (isAdmin == true) en Java
Écrire du code de type Java8 en Java8
[Java] N'utilisez pas "+" dans append!
Ne déclarez pas de variables dans List en Java
Sortie true avec if (a == 1 && a == 2 && a == 3) en Java (identifiant invisible)
Ecrire des rappels de vol en Java
Java avec Visual Studio Code
Devinez le code de caractère en Java
Faites Option.ou Null de Scala en Java
Faites HelloWorld avec Java / IntelliJ / Gradle
Environnement Java Spring dans vs Code
Écrire du code de test avec Spring Boot
[Rails] Que faire si les données ne sont pas enregistrées dans la base de données
Essayez une expression If en Java
Permettez-moi de faire le développement à distance VS Code + le développement Java dans un environnement proxy
Utilisez-vous Stream en Java?
Comment écrivez-vous dans Scala qui a été écrit en Java? (Liste → Carte)
Que faire lorsque le préfixe c n'est pas lié dans JSP
Comment faire une conversion de base en Java
N'acceptez pas System.in en cours de progression
Toutes les mêmes chaînes de code de hachage en Java
Ne pas revenir lors de la prise de notes en Ruby
Faites TensorFlow en Java. C'est facile, cependant. .. .. ..
Ajouter si non dans l'ensemble, message d'erreur si
[Mac] Installer Java dans Visual Studio Code
Dans certains cas, j'ai créé du code Java natif avec GraalVM mais je ne l'ai pas accéléré
Que faire si les modifications ne sont pas reflétées dans le fichier manifeste JAR
[Java] Que faire si vous obtenez une erreur dans Eclipse disant "Non autorisé au niveau source inférieur à 1.X"
Ajouter l'option --enable-preview dans Java dans Visual Studio Code
Techniques de lecture du code source Java dans Eclipse
Analyse de code statique par Checkstyle avec Java + Gradle
Code pour échapper aux chaînes JSON en Java
Deuxième décoction: essayez une expression If en Java
La solution pour NetBeans 8.2 ne fonctionne pas dans l'environnement Java 9
Essayez d'utiliser Sourcetrail (version win) avec du code Java
Je voulais que (a == 1 && a == 2 && a == 3) vrai en Java
Essayez d'utiliser Sourcetrail (version macOS) avec du code Java
Ecrire du code de liaison Selenium Java à l'aide de Silk WebDriver
[AtCoder Problem-ABC001] Observation du vent C-Do en Java [Code]
Comment écrire Java String # getBytes dans Kotlin?
[Angoisse du débutant Java] Code difficile à tester implémenté dans Junit
[Mac] Installer Java dans Visual Studio Code (VS Code)