web-dev-qa-db-fra.com

Quel style de codage utilisez-vous pour l'opérateur ternaire?

Je le garde sur une seule ligne, s'il est court. Dernièrement, j'utilise ce style pour les expressions d'opérateur ternaire plus longues ou imbriquées. Un exemple artificiel:

$value = ( $a == $b ) 
            ? 'true value # 1'
            : ( $a == $c )
                ? 'true value # 2'
                : 'false value';

Personnellement, quel style utilisez-vous ou trouvez-vous le plus lisible?

Modifier: (sur quand utiliser l'opérateur ternaire)

J'évite généralement d'utiliser plus de 2 niveaux d'opérateur ternaire profond. J'ai tendance à préférer l'opérateur ternaire profond à 2 niveaux à if-else à 2 niveaux, lorsque je fais écho à des variables dans les scripts de modèle PHP.

52
Imran

L'opérateur ternaire est généralement à éviter, mais cette forme peut être assez lisible:

  result = (foo == bar)  ? result1 :
           (foo == baz)  ? result2 :
           (foo == qux)  ? result3 :
           (foo == quux) ? result4 : 
                           fail_result;

De cette façon, la condition et le résultat sont conservés ensemble sur la même ligne, et il est assez facile de parcourir et de comprendre ce qui se passe.

86
Simon Howard

J'essaie de ne pas utiliser d'opérateur ternaire pour écrire des conditions imbriquées. Il défie la lisibilité et n'apporte aucune valeur supplémentaire par rapport à l'utilisation d'un conditionnel.

Seulement si elle peut tenir sur une seule ligne, et que cela signifie clairement, je l'utilise:

$value = ($a < 0) ? 'minus' : 'plus';
77
Tomalak

Personnellement, je n'utilise l'opérateur ternaire que s'il tient sur une seule ligne. S'il a besoin de s'étendre, alors c'est le bon vieux

if else if else
24
biozinc

un style que j'utilise parfois , que j'évoque car il n'a pas été mentionné, est comme ceci:

$result = ($x == y)
        ? "foo"
        : "bar";

..mais généralement seulement si tout mettre sur une seule ligne le rend trop long. Je trouve qu'avoir le = ? : tous les alignements la rendent plus nette.

14
nickf

Les opérateurs ternaires imbriqués PHP se comportent différemment.

Cette syntaxe passe tous les tests suivants. Basé sur http://deadlytechnology.com/web-development-tips/php-ternary-syntax/

$myvar = ($x == $y)
?(($x == $z)?'both':'foo')
:(($x == $z)?'bar':'none');

.

Voir: http://au.php.net/ternary

L'exemple n ° 3 "Comportement ternaire non évident" explique pourquoi ce qui suit ne fonctionne pas en PHP.

$x = 1;
$y = 2;
$z = 3;   
$myvar = ($x == $y) 
       ? "foo" 
       : ($x == $z) 
         ? "bar" 
         : "none";  
$myvar == 'none'; // Good

$x = 1;
$y = 2;
$z = 1;   
$myvar = ($x == $y) ? "foo" : ($x == $z) ? "bar" : "none";  
$myvar == 'bar'; // Good

$x = 1;
$y = 1;
$z = 3;   
$myvar = ($x == $y) ? "foo" : ($x == $z) ? "bar" : "none";  
$myvar == 'bar'; // Bad!

$x = 1;
$y = 1;
$z = 1;   
$myvar = ($x == $y) ? "foo" : ($x == $z) ? "bar" : "none";  
$myvar == 'bar'; // Bad!
13
Chris Jacob

les opérateurs ternaires sont de courts moyens efficaces pour écrire des instructions if simples. Ils ne doivent pas être imbriqués ou difficiles à lire. N'oubliez pas: vous écrivez le logiciel une fois mais il est lu 100 fois. Il devrait être plus facile à lire qu'à écrire.

9
Rick Kierner

J'ai tendance à mettre la condition entre parenthèses: (a == b)? dix

4
Guillaume Gervais

Je ne suis pas d'accord avec l'opinion commune. Je suis un peu comme Imran avec mon style d'opérateur conditionnel. S'il tient parfaitement sur une seule ligne, je le garde sur une seule ligne. S'il ne tient pas correctement sur une seule ligne, je le casse, mais je n'utilise qu'un seul onglet (4 espaces; j'ai défini VS pour insérer des espaces pour les onglets) pour le retrait. Je ne passe pas immédiatement à if-else, car la plupart du temps, l'opérateur conditionnel a plus de sens contextuellement. (Si cela n'a pas de sens contextuellement, cependant, je ne l'utilise tout simplement pas.)

De plus, je n'imbrique pas d'opérateurs conditionnels. À ce stade, je trouve cela trop difficile à lire, et il est temps de passer au style if-else plus verbeux.

2
John Rudy

Le conditionnel ternaire peut rendre le code plus propre et plus élégant, et surtout, vous aider à mettre l'accent sur les bonnes choses et à éviter de vous répéter. Pensez à les utiliser, mais ne rendez pas le code moins lisible en le faisant. Dans VB.NET:

'before refactoring 
If x = 0 Then                    ' If-Then-Else puts emphasis on flow control
    label = "None"
Else
    label = Foo.getLabel(x)      '  If-Then-Else forces repeat of assignment line
End If

'after refactoring    
label = If(x = 0, "None", Foo.getLabel(x)) ' ternary If puts emphasis on assignment

Notez que "c'est moins lisible" n'est pas la même chose que "je n'ai pas l'habitude de voir ça".

1
Patrick Szalapski

L '"exemple artificiel" est la façon dont je le mettrais en retrait, sauf que je le ferais à partir de la marge de gauche, non en fonction de l'endroit où le (ou ce qui se trouve sur la ligne ci-dessus).

Pour les détracteurs ternaires - la lisibilité est le point. Si vous ne pensez pas que cela rend le code plus lisible, ne l'utilisez pas. Mais je trouve que le contraire est le cas au moins une partie du temps.

1
ysth

Je ne l'utilise pas. Cela m'a toujours senti comme essayer d'économiser de l'espace et de taper du code source dans l'espoir que petite source == code compilé plus efficace.

Je ne le trouve pas du tout lisible, mais c'est en grande partie parce que je ne l'utilise jamais.

0
Tim

J'ai tendance à ne pas utiliser du tout l'opérateur ternaire car je trouve que si ... beaucoup plus lisible.

0
SmacL

Imran, tu l'as magnifiquement formaté. Cependant, l'opérateur ternaire a tendance à devenir illisible lorsque vous en imbriquez plus de deux. un bloc if-else peut vous donner un niveau supplémentaire d'imbrication compréhensible. Au-delà de cela, utilisez une fonction ou une programmation pilotée par table.

0
Yuval F
$foo = (isset($bar)) ? $bar : 'default';
0
stefan2904

Personnellement, je ne l'utilise que pour l'affectation d'une variable (en Java) par exemple:

String var = (obj == null) ? "not set" : obj.toString();

et (autre exemple) lors de l'utilisation d'une fonction qui n'autorise pas les paramètres null tels que:

String val; [...]
int var = (val == null) ? 0 : Integer.parseInt(val);
0
Vinze