198 votes

Ternaire ou pas ?

Je suis personnellement un défenseur de l'opérateur ternaire : () ? : ; je réalise qu'il a sa place, mais j'ai rencontré beaucoup de programmeurs qui sont complètement contre son utilisation, et certains qui l'utilisent trop souvent.

Quel est votre sentiment à ce sujet ? Quel code intéressant avez-vous vu l'utiliser ?

9 votes

Utilisez-le quand c'est clair, évitez-le quand c'est confus. C'est une question de jugement. Il peut rendre le code plus lisible, mais seulement pour les expressions simples. Essayer de toujours L'utiliser est tout aussi menaçant que de l'éviter sans relâche.

4 votes

En fait, c'est l'opérateur conditionnel. Une question proche de la duplication est stackoverflow.com/questions/725973/ .

0 votes

J'utilisais parfois x = x if x else y mais il s'est ensuite renseigné et a réalisé, avec l'aide d'autres personnes, que cela se résumait à x = x ou y ( stackoverflow.com/questions/18199381/self-referencing-ternary/ )

263voto

marcospereira Points 3144

Utilisez-le pour expressions simples uniquement :

int a = (b > 10) ? c : d;

Ne pas faire de chaînes ou de nids opérateurs ternaires, car ils sont difficiles à lire et prêtent à confusion :

int a = b > 10 ? c < 20 ? 50 : 80 : e == 2 ? 4 : 8;

En outre, lorsque vous utilisez l'opérateur ternaire, pensez à formater le code de manière à en améliorer la lisibilité :

int a = (b > 10) ? some_value                 
                 : another_value;

96 votes

Je suis tout à fait d'accord avec les premières affirmations, mais je ne suis pas du tout d'accord avec votre exemple d'"amélioration de la lisibilité". Si vous optez pour les lignes multiples, pourquoi ne pas simplement utiliser une instruction if ?

5 votes

Juste parce que if else est un peu plus verbeux pour des décisions simples : int a = 0 ; if(b > 10) a = some_value ; else a = another_value ; Que préférez-vous ?

48 votes

@d03boy : Parce que l'instruction if n'est que cela, une instruction, et ne fera pas l'affaire quand tout ce que vous voulez est une expression.

157voto

David Segonds Points 25602

Cela rend le débogage légèrement plus difficile puisque vous ne pouvez pas placer de points d'arrêt sur chacune des sous-expressions. Je l'utilise rarement.

59 votes

C'est le meilleur argument contre l'opérateur ternaire que j'ai jamais entendu. Je n'adhère pas à l'argument "pas lisible" (il me semble que les gens sont trop paresseux pour s'y habituer), mais celui-ci a vraiment de la substance.

2 votes

Si vous faites quelque chose à l'intérieur d'un ternaire qui nécessite un débogage, alors il est probablement mal utilisé. Les ternaires devraient être utilisés pour de simples affectations, selon l'IMO. Si vous avez besoin de passer par le ternaire, et que voir la valeur de l'affectation après coup ne suffit pas, le ternaire n'est PAS votre problème réel. C'est la complexité de l'opération. Faites-en une instruction if à ce moment-là.

83voto

Ian P Points 7930

Je les adore, surtout dans les langages à sécurité intrinsèque.

Je ne vois pas comment :

int count = (condition) ? 1 : 0;

n'est pas plus difficile que ça :

int count;

if (condition)
{
  count = 1;
}
else
{
  count = 0;
}

Je dirais que les opérateurs ternaires rendent tout moins complexe et plus ordonné que l'alternative.

6 votes

L'initialisation ternaire est encore plus utile en D ou en C++ lorsque la variable est constante. ex. const int count = ...;

0 votes

Eh bien, vous déformez un peu les faits. if/else avec les accolades inutiles.

1 votes

De même, dans ce cas, si condition es bool vous pourriez juste faire int count = condition;

48voto

rampion Points 38697

Enchaîné, ça me va - imbriqué, pas vraiment.

J'ai tendance à les utiliser davantage en C, simplement parce qu'ils sont une si qui a de la valeur, ce qui permet de réduire les répétitions ou les variables inutiles :

x = (y < 100) ? "dog" :
    (y < 150) ? "cat" :
    (y < 300) ? "bar" : "baz";

plutôt que

     if (y < 100) { x = "dog"; }
else if (y < 150) { x = "cat"; }
else if (y < 300) { x = "bar"; }
else              { x = "baz"; }

Dans ce genre de mission, je trouve qu'il y a moins à remanier et que c'est plus clair.

D'autre part, lorsque je travaille en ruby, je suis plus susceptible d'utiliser if...else...end parce que c'est aussi une expression.

x =   if (y < 100) then "dog"
    elif (y < 150) then "cat"
    elif (y < 300) then "bar"
    else                "baz"
    end

(Même si, il faut bien l'admettre, pour quelque chose d'aussi simple, je pourrais de toute façon utiliser l'opérateur ternaire).

41voto

Ryan Delucchi Points 3323

El ternaire ?: est simplement un équivalent fonctionnel de l'opérateur procédural if construire. Ainsi, tant que vous n'utilisez pas de structures imbriquées ?: les arguments pour ou contre la représentation fonctionnelle de toute opération s'appliquent ici. Mais l'imbrication des opérations ternaires peut donner lieu à un code carrément confus (exercice pour le lecteur : essayez d'écrire un analyseur syntaxique qui gère les conditionnelles ternaires imbriquées et vous apprécierez leur complexité).

Mais il y a beaucoup de situations où l'utilisation conservatrice de la ?: peut aboutir à un code qui est en fait plus facile à lire qu'autrement. Par exemple :

int compareTo(Object object) {
    if((isLessThan(object) && reverseOrder) || (isGreaterThan(object) && !reverseOrder)) {
       return 1;
    if((isLessThan(object) && !reverseOrder) || (isGreaterThan(object) && reverseOrder)) {
       return -1;
    else
      return 0;
}

Maintenant, comparez ça avec ceci :

int compareTo(Object object) {
    if(isLessThan(object))
        return reverseOrder ? 1 : -1;
    else(isGreaterThan(object))
        return reverseOrder ? -1 : 1;
    else
       return 0;
}

Comme le code est plus compact, il y a moins de bruit syntaxique, et en utilisant l'opérateur ternaire de manière judicieuse (c'est-à-dire uniquement en relation avec l'opérateur ordre inverse propriété) le résultat final n'est pas particulièrement laconique.

0 votes

Je continuerais à préconiser l'utilisation des accolades sur chaque construction if/then/else qui n'est pas ternaire, donc votre deuxième exemple en manque un peu, je pense.

0 votes

Oui, il est fonctionnel. C'est comme une petite fonction qui a un seul argument booléen et qui retourne cualquier le type que vous voulez ! C'est un opérateur très efficace.

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