Pregunta

Lo mantengo en una sola línea, si es corto. Últimamente he estado usando este estilo para expresiones de operador ternarias más largas o anidadas. Un ejemplo artificial:

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

¿Personalmente qué estilo usa o encuentra más legible?

Editar: (sobre cuándo usar el operador ternario)

Usualmente evito usar más de 2 niveles de operador ternario profundo. Tiendo que prefiero el operador ternario profundo de 2 niveles sobre el nivel 2 si no, cuando hago eco de las variables en los scripts de plantillas PHP.

¿Fue útil?

Solución

El operador ternario generalmente se debe evitar, pero esta forma puede ser bastante legible:

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

De esta manera, la condición y el resultado se mantienen juntos en la misma línea, y es bastante fácil de descifrar y entender lo que está pasando.

Otros consejos

Intento no usar un operador ternario para escribir condiciones anidadas. Desafía la legibilidad y no proporciona ningún valor adicional sobre el uso de un condicional.

Solo si puede caber en una sola línea, y es muy claro lo que significa, lo uso:

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

Personalmente, solo uso el operador ternario si cabe en una línea. Si necesita abarcar, entonces es hora de que los buenos

if else if else

un estilo que uso a veces , que menciono ya que no se ha mencionado, es así:

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

..pero generalmente solo si ponerlo todo en una línea lo hace demasiado largo. Encuentro que tener el =? : toda la línea hace que se vea más ordenado.

Los operadores ternarios anidados de PHP se comportan de manera diferente.

Esta sintaxis pasa todas las pruebas siguientes. Basado en http://deadlytechnology.com/web-development-tips/php- sintaxis ternaria /

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

.

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

Ejemplo # 3 "Comportamiento ternario no obvio" explica por qué lo siguiente no funciona 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!

los operadores ternarios son formas cortas y efectivas de escribir simples instrucciones if. No deben ser anidados o difíciles de leer. Recuerde: Usted escribe el software una vez, pero se lee 100 veces. Debería ser más fácil de leer que escribir.

Tiendo a incluir la condición entre paréntesis: (a == b)? 1: 0

Estaré en desacuerdo con la opinión común. Soy un poco como Imran con mi estilo de operador condicional. Si cabe limpiamente en una línea, lo mantengo en una línea. Si no encaja limpiamente en una línea, la rompo, pero uso solo una pestaña (4 espacios; tengo configurado VS para insertar espacios para las pestañas) para la sangría. No salto inmediatamente a if - else , porque muchas veces el operador condicional tiene más sentido en el contexto. (Sin embargo, si no tiene sentido contextualmente, simplemente no lo uso).

Además, no anidado operadores condicionales. En ese momento, me resulta demasiado difícil de leer, y es hora de ir al estilo más detallado de if - else .

El " ejemplo creado " así es como lo sangraría, excepto que sangraría desde el margen izquierdo, no en función de dónde esté (o lo que esté en la línea de arriba).

Para los detractores ternarios - la legibilidad es el punto. Si no crees que sea un código más legible, no lo uses. Pero me parece que lo contrario es el caso al menos parte del tiempo.

El condicional ternario puede hacer que el código sea más limpio y elegante y, lo que es más importante, ayudarlo a poner énfasis en las cosas correctas y evitar repetirlo. Considere usarlos, pero no haga que el código sea menos legible al hacerlo. En 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

Tenga en cuenta que " es menos legible " no es lo mismo que " no estoy acostumbrado a ver eso " ;.

No lo uso. Siempre me olía como a intentar ahorrar espacio y escribir el código fuente con la expectativa de que una fuente pequeña == código compilado más eficiente.

No lo puedo leer en absoluto, pero gran parte de eso se debe a que nunca lo uso.

Tiendo a no usar el operador ternario en absoluto porque encuentro si ... otra cosa es mucho más legible.

Imran, has formateado esto muy bien. Sin embargo, el operador ternario tiende a ser ilegible a medida que anida más de dos. un bloque if-else puede darle un nivel adicional de anidamiento comprensible. Más allá de eso, use una función o una programación basada en tablas.

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

Personalmente, solo lo uso para una asignación de una variable (en java), por ejemplo:

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

y (otro ejemplo) cuando se usa una función que no permite un parámetro nulo como:

String val; [...]
int var = (val == null) ? 0 : Integer.parseInt(val);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top