Pregunta

Ha surgido una discusión en mi oficina sobre el uso de operadores ternarios. Hay dos lados en esta discusión.

Lado 1) Que los operadores ternarios son fáciles de escribir y leer, por lo tanto, la conveniencia es un ahorro neto de costos.

Lado 2) Que los operadores ternarios son difíciles de mantener porque requieren un exceso de cambio de código si alguna vez necesitan ser modificados para ser incluso un poco más complejos.

Puntos nerd adicionales si puede citar algún estudio real realizado por una institución de primer nivel sobre este tema ... Estoy muy interesado en ver datos concretos sobre esto.


Mi teoría es que el mejor código es el código que puede cambiar y adaptarse fácilmente, y que cuanto menor complejidad requiera ese cambio, menos posibilidades hay de un descanso. Ejemplo:

$id = $user->isRegistered() ? $user->id : null;

Ok, entonces esto es completamente válido, pero ¿qué sucede cuando el código necesita cambiar para convertirse en algo un poco más complejo?

$id = null;
if ($user->isRegistered() || $user->hasEmail()) {
    $id = $user->id;
}

Cualquier programador sensato miraría el ternario y lo convertiría a estándar si / si no. Sin embargo, esto requirió un cambio de 4 líneas en lugar de comenzar con:

if ($user->isRegistered()) {
    $id = $user->id;
}

Que solo requeriría un cambio de 1 línea.

¿Fue útil?

Solución

Me parece que una vez que te acostumbras a la sintaxis, ambas opciones son igualmente legibles (siempre que tampoco te excedas) y eso no es un problema para mí.

En cuanto a cuál es más eficiente en el tiempo, voy a responder con una pregunta desagradable: ¿por qué te importa? Cualquiera de las opciones tarda menos de 20 segundos en convertirse en una declaración if equivalente.

Personalmente, encuentro que cuando encuentro formas de cincelar segundos de mi tiempo de programación, es una forma de dilación. Trabajo mejor cuando me concentro en hacer las cosas y dejo que los pequeños detalles de legibilidad se resuelvan a través de la experiencia.

Otros consejos

Me quedaría con el operador de ternery en su ejemplo.

   $id = ($user->isRegistered() ||  $user->hasEmail())? $user->id : null;

Siempre y cuando la única "rama" es decidir qué valor se asignará a una variable, el operador de ternery es más legible que las cláusulas if-else, porque no duplica potencialmente la función real que se está realizando (en este caso, este es el código $ id = ")      Si las condiciones lógicas se vuelven complejas, simplifíquelas.

   bool $isReg    = $user->isRegistered(),
        $hasEmail = $user->hasEmail();
   $id = ($isReg || $hasEmail)?  $user->id : null;

Me gusta usar el operador ternario cada vez que tengo una expresión de una línea donde el valor depende de una condición booleana apropiada. En efecto, si necesito elegir entre asignar a una variable, y puedo elegir entre la Expresión 1 y la Expresión 2, entonces a menudo uso un ternario.

Sin embargo, si las expresiones tienen un efecto secundario, inmediatamente reescribiré todo como una declaración if (). El uso del operador ternario para el control de flujo es bastante confuso para la mayoría de las personas.

Las operaciones ternarias tienen su lugar; generalmente es para simplificar el código cuando se realiza una tarea trivial. Sin embargo, en algún momento, es posible que deba repensar su estrategia si la declaración condicional se vuelve demasiado compleja. Es determinante cuándo ese punto es se convierte en el desafío. Solo la experiencia puede guiarte entonces.

Entonces, no creo que haya uno '' correcto '' responda siempre que el resultado final sea un código limpio, legible y mantenible. Las líneas de código adicionales para la instrucción if ni siquiera deberían considerarse al hacer esta determinación (ya que el número de líneas de código no necesariamente se correlaciona de 1 a 1 con la complejidad del código .)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top