Question

S'agit-il d'une pratique de codage acceptable?

public class MessageFormat {
    private static final Color DEFAULT_COLOR = Color.RED;

    private Color messageColor = DEFAULT_COLOR;

    public MessageFormat(Person person) {
        Color color = person.getPreferredColor();
        messageColor = (color != null) ? color : messageColor; // this line
    }
}

ou suis-je mieux d'aller avec le classique ...

if (color != null) {
    messageColor = color;
}
Était-ce utile?

La solution

L'utilisation de l'opérateur?: doit être limitée pour rendre le code plus lisible. Un exemple classique:

a = sprintf( "There are %i green bottle%s on the wall.", i, (i==1?"":"s") );

Dans ce cas, le code serait moins lisible si vous le divisiez en environ 5 lignes if / else.

Je mets généralement des crochets autour de tout l'opérateur, de sorte qu'à la lire, je l'analyse mentalement comme une valeur unique.

 messageColor = (color != null ? color : messageColor); 

Une autre variante est

messageColor = color || messageColor;

Ce qui, dans certaines langues, sera considéré comme "couleur", à moins que la couleur ne soit considéré comme "faux", auquel cas la valeur de messageColor. À mon avis, cela devrait être évité car cela pourrait dérouter les gens.

La chose la plus importante est d’être cohérent afin que la prochaine personne qui lit votre code (même si c’est vous) ait un minimum de surcharge cognitive.

Autres conseils

La

lisibilité, la facilité de compréhension, etc. sont les mêmes dans ce cas ( je veux dire, allez ... ). Je n'aime pas la duplication et l'auto-assignation apparente dans le premier exemple; cela se traduirait par quelque chose comme:

if (colour != null) {messageColour = colour;}
   else {messageColour = messageColour;};

ce qui est un peu stupide.

J'écrirais habituellement le deuxième d'une ligne, mais c'est une question de fantaisie individuelle. directives de style de codage:

if (colour != null) {messageColour = colour;};

EDIT (Je suis maintenant plus d'opinion qu'il y a 8 ans)

Puisque vous recherchez les meilleures pratiques:

// Use default visibility by default, especially in examples.
// Public needs a reason.
class MessageFormat {
    static final Color DEFAULT_COLOR = Color.RED;

    // Strongly prefer final fields.
    private final Color messageColor;

    // Protect parameters and variables against abuse by other Java developers
    MessageFormat (final Person person) {
        // Use Optionals; null is a code smell
        final Optional<Color> preferredColor = person.getPreferredColor();
        // Bask in the clarity of the message
        this.messageColor = preferredColor.orElse(DEFAULT_COLOR);
    }
}

L’utilisation de l’opérateur ternaire est souvent une question délicate, au même titre que les autres normes de codage. Son utilisation est probablement mieux déterminée par les normes de codage de votre site.

Cependant, dans cette situation particulière, je recommanderais sans hésiter la deuxième option; non seulement cela est plus clair, mais l'utilisation de l'opérateur ternaire est totalement inutile ici. Il n'est pas nécessaire de réaffecter messageColor à lui-même. La seule fonction de l'opérateur ternaire dans cette situation particulière est donc l'obscurcissement du code.

L’opérateur ternaire est plus courant chez les programmeurs C. En C, si vous évitez les structures de contrôle, vous obtiendrez souvent un meilleur traitement en pipeline, car aucune prédiction de branche ne risque de se tromper. Je doute que vous constatiez une différence de performances en Java, et le modèle if-null-then-assign-assign est bien plus courant que le modèle ternaire. Cependant, si vous maintenez une base de code existante, il est généralement préférable de rester cohérent avec le code existant.

Si cela vous arrive souvent, vous pouvez écrire une fonction defaultIfNull , firstNonNull ou coalesce qui rendra le code encore plus concis. Apache Commons Lang inclut une fonction defaultIfNull .

Certaines langues incluent un opérateur || = , qui est l'idiome habituel pour les valeurs par défaut dans ces langues.

Je préfère la seconde parce qu’elle exprime plus clairement ce que vous voulez dire: vous ne voulez changer la couleur que si elle n’est pas nulle. La première méthode ne rend pas cela si clair.

Dans votre cas, je préférerais l'implémentation "classique", car pour moi, il est plus rapide de comprendre que vous ne souhaitez utiliser une nouvelle couleur que si la personne en a une préférée.

Je l'utilise parfois dans les appels de méthode si je veux éviter les NPE, mais j'élimine généralement ces vilains morceaux de code dans l'un des refactorings suivants;)

Les opérateurs ternaires sont souvent maltraités car le code qu’ils produisent semble intelligent et compact.

En fait, ils rendent le code moins lisible et plus sujet aux erreurs. Dans la mesure du possible, il est conseillé d’utiliser la version plus longue de

 if ( <condition> ) {
     <action> ;
 }

Au lieu d'une syntaxe ternaire.

Cela me convient (j'utilise beaucoup l'opérateur ternaire de Python), mais ce type de problème de style est généralement très subjectif. Si le projet contient un document de style de codage, vous pouvez le vérifier.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top