programacion-operador-ternario

El operador ternario

El condicional ternario, también conocido como operador ternario, es una estructura de control que permite evaluar una condición y retornar un valor en función de esa condición.

El operador ternario se llama así porque, en general, es el único operador de un lenguaje que tiene tres parámetros. El resto suelen tener uno parámetro, como el operador negación !mivariable o dos, cómo los operadores suma a+b

A diferencia de los condicionales IF-ELSE, el condicional ternario se compone de una única línea de código y tiene la siguiente sintaxis general:

resultado = condicion ? valor_si_cierto : valor_si_falso

En esta expresión:

  • Se evalúa la condición
  • Si es true, se devuelve valor_verdadero
  • Si es true, se devuelve valor_falso

Esta estructura es muy útil cuando se necesita asignar un valor a una variable o realizar una operación sencilla en función de una condición.

Al igual que en el resto de los condicionales condiciontiene que ser una expresión que evalúa a un valor booleano. Es decir, tiene que ser una de las siguientes expresiones,

  • false o true
  • Una variable booleana
  • Una expresión que evalúa como booleano
  • La llamada de una función que devuelve un booleano

Equivalente en IF-ELSE

Si hacemos el equivalente en un bloque IF-ELSE del operador terciario, quedaría algo así.

let resultado

if(condicion)   resultado = valor_si_cierto
else            resultado = valor_si_falso

Como vemos es algo (ligeramente) más largo.

Ejemplos de operador ternario en distintos lenguajes

Como decía muchos lenguajes implementan el operador ternario como forma de comparación.

Por ejemplo, en el caso de C, C++, Java y C#, el condicional ternario tiene la siguiente forma,

int edad = 18;
string resultado = edad >= 18 ? "Eres mayor de edad" : "Eres menor de edad";

En este ejemplo, utilizamos el condicional ternario en C# para asignar un mensaje de acuerdo a la edad. Si la edad es mayor o igual a 18, se asigna el mensaje “Eres mayor de edad”, de lo contrario se asigna el mensaje “Eres menor de edad”.

En JavaScript el operador ternario es idéntico. En el ejemplo solo varía que JavaScript no declara el tipo de las variables, pero la sintaxis del condicional es la misma.

let edad = 18;
let resultado = edad >= 18 ? "Eres mayor de edad" : "Eres menor de edad";

En Python el condicional es algo diferente, y tiene la siguiente forma.

edad = 18
resultado = "Eres mayor de edad" if edad >= 18 else "Eres menor de edad"

Por poner un ejemplo más bizarro, enSQLel operador ternario no existe, y en su lugar se proporciona una función IFF que cumple el mismo papel.

IIF(@type = 2, 1, 0)

Anidamiento de operadores ternarios

Al igual que el resto de los operadores, el condicional ternario se puede encadenar. Con esto se puede generar condicionales más complejos, como por ejemplo.

let condition1 = false;
let condition2 = true;
let b = condition1 ? 'true1' 
      : condition2 ? 'true2' 
      : 'false_both';

En algunas circunstancias esto puede mejorar la legibilidad del código. Pero no conviene abusar de ello porque, en general, podéis montar sentencias muy complicadas de leer.

Buenas prácticas y consejos de limpieza Consejos

Mantenlo simple y legible: El operador ternario puede ser útil para expresar lógica condicional de manera concisa. Sin embargo, evita abusar de él y asegúrate de que la expresión sea fácil de entender y no se vuelva demasiado compleja.

Evita anidar operadores ternarios: Anidar múltiples operadores ternarios puede dificultar la legibilidad del código. En general, evítalo.

No hagas llamadas a funciones pesadas: El operador ternario debe ser siempre sencillo. No lo uses para

var a = validarDatos() ? valor_true : valor_false;

En su lugar, prefiere

var isValid = validarDatos() 
var a = isValid ? valor_true : valor_false;

Prefiere claridad a brevedad:. A la mínima de si el código queda más legible o menos, considera utilizar condicionales IF-ELSE o descomponer la lógica en múltiples líneas para hacerla más clara y comprensible.

Usa paréntesis para evitar ambigüedades: Si tienes expresiones más complejas que involucran operadores ternarios, utiliza paréntesis para asegurarte de que la evaluación se realice correctamente y evitar ambigüedades en la precedencia de operadores.

Relación con paradigma funcional Avanzado

Suele decirse que el condicional ternario sigue el paradigma de la programación personal. Bueno, eso no es exactamente cierto. Digamos que es “más dado” a la programación funcional que un IF. Pero que sea funcional o no depende totalmente de cómo lo usemos.

Por ejemplo, si lo usamos como es habitual, evaluando una condición y devolviendo un valor u otro, es programación funcional.

let resultado = condicion ? 'si' : 'no'

Si en lugar de devolver una variable o un literal, realizo una llamada a una función, empezamos a acercarnos a la zona roja.

function funcion_si() {
  // no hago nada
  return 'si'
}

function funcion_no() {
  // no hago nada
  return 'no'
}

let resultado = condicion ? funcion_si() : funcion_no();

En el ejemplo anterior, las funciones de valor pero no realizan acciones. Sigue siendo programación funcional, pero menos que antes.

Si en este ejemplo, en lugar de devolver un valor realizáramos acciones, ya no sería funcional. Por ejemplo, lo siguiente,

function funcion_si() {
  // hago cosas y no devuelvo nada
}

function funcion_no() {
  // hago cosas y no devuelvo nada
}

condicion ? funcion_si() : funcion_no();

No es en absoluto funcional, por mucho que estés usando un condicional ternario. Aquí se está usando el operador ternario para hacer una bifurcación de código. Ni siquiera estamos empleando el valor resuelto.

Que no digo que no sea correcto (para mi limpio no es, pero es debatible), lo que desde luego no es es funcional.

Así que si algún día tenéis una conversación sobre esta, lo correcto es decir “el operador ternario facilita un paradigma funcional”, pero no es funcional. Dependerá de cómo lo usemos.