web-dev-qa-db-fra.com

Utilisation de l'opérateur ternaire avec 4 expressions

Est-ce 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;
}
11
Brandon Coffman

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 les 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 évaluée comme "faux", auquel cas la valeur de messageColor. À mon avis, cela devrait être évité, car cela risquerait de semer la confusion parmi 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. 

24

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);
    }
}
4
Svante

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 certainement 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.

2
Gabriel Reid

L'opérateur ternaire est plus commun parmi 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 vous le faites 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. 

2
brianegge

Je préfère le second parce qu'il 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.

1
Mark Byers

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. Chaque fois que possible, il est conseillé d’utiliser la version plus longue de 

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

Au lieu d'une syntaxe ternaire.

1
Alon

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

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

1
Andreas_D

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.

0
djc