Beneficios de usar el operador condicional ?: (ternario)

Resuelto KChaloux asked hace 14 años • 17 respuestas

¿Cuáles son los beneficios y desventajas del operador ?: en comparación con la declaración estándar if-else. Los obvios son:

¿Condicional?: Operador

  • Más breve y conciso cuando se trata de comparaciones y asignaciones de valores directos
  • No parece ser tan flexible como la construcción if/else

Estándar si/si no

  • Se puede aplicar a más situaciones (como llamadas a funciones)
  • A menudo son innecesariamente largos

La legibilidad parece variar para cada uno según la declaración. Durante un tiempo, después de haber estado expuesto por primera vez al operador ?:, me tomó algo de tiempo digerir exactamente cómo funcionaba. ¿Recomendaría usarlo siempre que sea posible, o mantenerlo si no, dado que trabajo con muchos no programadores?

KChaloux avatar Jul 23 '10 02:07 KChaloux
Aceptado

Básicamente, recomendaría usarlo solo cuando la declaración resultante sea extremadamente corta y represente un aumento significativo en la concisión sobre el equivalente if/else sin sacrificar la legibilidad.

Buen ejemplo:

int result = Check() ? 1 : 0;

Mal ejemplo:

int result = FirstCheck() ? 1 : SecondCheck() ? 1 : ThirdCheck() ? 1 : 0;
Dan Tao avatar Jul 22 '2010 19:07 Dan Tao

Esto está prácticamente cubierto por las otras respuestas, pero "es una expresión" realmente no explica por qué es tan útil...

En lenguajes como C++ y C#, puedes definir campos locales de solo lectura (dentro del cuerpo de un método) usándolos. Esto no es posible con una declaración convencional si/entonces porque el valor de un campo de solo lectura debe asignarse dentro de esa única declaración:

readonly int speed = (shiftKeyDown) ? 10 : 1;

no es lo mismo que:

readonly int speed;  
if (shifKeyDown)  
    speed = 10;    // error - can't assign to a readonly
else  
    speed = 1;     // error  

De manera similar, puedes incrustar una expresión terciaria en otro código. Además de hacer que el código fuente sea más compacto (y, en algunos casos, más legible como resultado), también puede hacer que el código de máquina generado sea más compacto y eficiente:

MoveCar((shiftKeyDown) ? 10 : 1);

...puede generar menos código que tener que llamar al mismo método dos veces:

if (shiftKeyDown)
    MoveCar(10);
else
    MoveCar(1);

Por supuesto, también es una forma más conveniente y concisa (menos escritura, menos repetición y puede reducir la posibilidad de errores si tiene que duplicar fragmentos de código en un if/else). En casos limpios de "patrón común" como este:

object thing = (reference == null) ? null : reference.Thing;

... es simplemente más rápido de leer/analizar/comprender (una vez que estás acostumbrado) que el largo equivalente if/else, por lo que puede ayudarte a "asimilar" el código más rápido.

Por supuesto, sólo porque sea útil no significa que sea lo mejor que se puede utilizar en todos los casos. Recomendaría usarlo solo para fragmentos cortos de código donde el significado sea claro (o se haga más claro) mediante el uso ?:; si lo usa en código más complejo o anida operadores ternarios entre sí, puede hacer que el código sea terriblemente difícil de leer. .

Jason Williams avatar Jul 22 '2010 21:07 Jason Williams

Por lo general, elijo un operador ternario cuando, de lo contrario, tendría mucho código duplicado.

if (a > 0)
    answer = compute(a, b, c, d, e);
else
    answer = compute(-a, b, c, d, e);

Con un operador ternario, esto podría lograrse con lo siguiente.

answer = compute(a > 0 ? a : -a, b, c, d, e); 
 avatar Jul 22 '2010 20:07