Question

Je le garde sur une seule ligne, si c'est court. Dernièrement, j'utilise ce style pour des expressions d'opérateur ternaires 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: (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 un opérateur ternaire profond à deux niveaux à un autre si, sinon, lorsque je répète des variables dans des scripts de template PHP.

Était-ce utile?

La solution

L’opérateur ternaire est généralement à éviter, mais ce formulaire peut être très 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 survoler et de comprendre ce qui se passe.

Autres conseils

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

Seulement si cela peut tenir sur une seule ligne, et que sa signification soit claire, je l'utilise:

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

Personnellement, je n’utilise l’opérateur ternaire que s’il tient sur une seule ligne. Si cela doit durer, alors il est temps pour le bon vieux

if else if else

un style que je parfois utilise, ce que je parle parce qu'il n'a pas été mentionné, est comme ceci:

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

.. mais généralement uniquement si le tout sur une seule ligne le rend trop long. Je trouve cela avoir le =? : tout alignement le rend plus net.

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- syntaxe ternaire /

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

.

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

Exemple # 3 "Un 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!
Les opérateurs

ternaires sont des moyens rapides et efficaces d’écrire des déclarations simples si Ils ne doivent pas être imbriqués ou difficiles à lire. Rappelez-vous: vous écrivez le logiciel une fois mais il est lu 100 fois. Il devrait être plus facile à lire qu'à écrire.

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

Je suis en désaccord avec l'opinion commune. Je suis un peu comme Imran avec mon style d'opérateur conditionnel. Si cela correspond parfaitement à une ligne, je le garde sur une seule ligne. Si cela ne correspond pas parfaitement à une ligne, je le casse, mais je n'utilise qu'un seul onglet (4 espaces; j'ai VS configuré pour insérer des espaces pour les onglets) pour l'indent. Je ne saute pas immédiatement sur si - sinon , car la plupart du temps, l'opérateur conditionnel a plus de sens en contexte. (Si cela n'a pas de sens contextuellement, cependant, je ne l'utilise tout simplement pas.)

De plus, je ne niche pas d'opérateurs conditionnels. À ce stade, je trouve la lecture trop difficile et il est temps de passer au style plus verbeux si - sinon .

L’expression "exemple artificiel" C’est ainsi que je voudrais le mettre en retrait, sauf que je le ferais à partir de la marge de gauche, et non en fonction du lieu où ((ou de ce que vous voyez sur la ligne ci-dessus).

Pour les détracteurs ternaires - la lisibilité est l’essentiel. Si vous pensez que cela ne rend pas le code plus lisible, ne l'utilisez pas. Mais je trouve le contraire être le cas au moins de temps en temps.

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 cela".

Je ne l'utilise pas. Cela m'a toujours semblé comme d'essayer de gagner de la place et de taper du code source en espérant qu'une 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.

J’ai tendance à ne pas utiliser l’opérateur ternaire du tout, comme je le trouve si… sinon beaucoup plus lisible.

Imran, vous l’avez superbement formatée. Cependant, l'opérateur ternaire a tendance à devenir illisible si vous imbriquez plus de deux. un bloc if-else peut vous donner un niveau supplémentaire d'imbrication compréhensible. Au-delà, utilisez une programmation basée sur une fonction ou une table.

$foo = (isset($bar)) ? $bar : 'default';

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 n'autorisant pas de paramètre null tel que:

String val; [...]
int var = (val == null) ? 0 : Integer.parseInt(val);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top