programacion-condicional-switch

El condicional SWITCH

El condicional SWITCH es una estructura de control que ofrece una alternativa al condicional IF-ELSE para tomar decisiones basadas en múltiples casos.

El condicional SWITCH permite evaluar una expresión y ejecutar diferentes bloques de código en función del valor de dicha expresión.

Dicho en lenguaje natural, el condicional SWITCH

En función de lo que valga ‘esto’, haz una de estas cosas…

De forma general, su sintaxis es la siguiente,

switch(expresion):
    case valor1:
        // código a ejecutar si la expresion es igual a valor1
        break;
    case valor2:
        // código a ejecutar si la expresion es igual a valor2
        break;
    case valor3:
        // código a ejecutar si la expresion es igual a valor3
        break;
    default:
        // código a ejecutar si la expresion no coincide con ninguno de los casos anteriores

En el caso de un condicional SWITCH en lugar de una condición, se emplea una expresión que proporciona un valor. Por ejemplo, puede ser un número, o un texto.

Durante la ejecución del SWITCH la expresión evalúa, y su valor se compara con cada uno de los posibles casos definidos. Si hay una coincidencia, se ejecuta el bloque de código correspondiente a ese caso.

El último caso default es opcional, y se ejecuta cuando la expresión no coincide con ninguno de los casos que hemos definido anteriormente.

También habéis notado el uso de la instrucción break después de cada bloque de código, para salir del condicional y evitar la ejecución de otros casos.

En algunos lenguajes este break no es obligatorio, y permite la ejecución de más de un bloque en caso de coincidencia. Esto se llamaba ‘fallthrough’ y generaba código difícil y propenso a fallos.

En la actualidad el ‘fallthrough’ la actualidad se considera una práctica desaconsejada. Tanto, que muchos lenguajes prohíben su uso, y obligan a poner siempre el break.

Comparación con IF-ELSE

El código que he mostrado anteriormente es equivalente a el siguiente bloque IF-ELSE.

if (expresion == valor1)
{
    // código a ejecutar si la expresion es igual a valor1
}
else if (expresion == valor2)
{
    // código a ejecutar si la expresion es igual a valor2
}
else if (expresion == valor3)
{
    // código a ejecutar si la expresion es igual a valor3
}
else
{
    // código a ejecutar si la expresion no coincide con ninguno de los casos anteriores
}

En general, no es mucho más largo que el condicional SWITCH. En buena parte, por que la obligatoriedad de tener que poner el break hace que el SWITCH sea innecesariamente largo.

Ejemplos de condicional SWITCH en distintos lenguajes

Vamos a ver ejemplos de uso del condicional SWITCH en diferentes lenguajes de programación:

Por ejemplo, en C++, Java, C# y JavaScript, el código sería el siguiente,

int diaSemana = 3;
switch (diaSemana)
{
    case 1:
        // acciones a realizar si es Lunes
        break;
    case 2:
        // acciones a realizar si es Martes
        break;
    case 3:
        // acciones a realizar si es Miercoles
        break;
    case 4:
        // acciones a realizar si es Jueves
        break;
    case 5:
        // acciones a realizar si es Viernes
        break;
    default:
        // acciones a realizar si es Fin de semana
        break;
}

Por ejemplo, en el caso de Python, a partir de la versión 3.10 incorpora una estructura SWITCH, pero en este caso se emplea la palabra reservada match.

match diaSemana:
    case 1:
        print("Lunes")
    case 2:
        print("Martes")
    case 3:
        print("Miércoles")
    case 4:
        print("Jueves")
    case 5:
        print("Viernes")
    case _:
        print("Fin de semana")

No obstante no todos los lenguajes tienen un condicional SWITCH. De hecho, como he dicho, Python antes de la versión 3.10 no disponía de esta estructura. En los lenguajes que no disponen de SWITCH deberá realizarse mediante el código equivalente IF-ELSEIF.

Uso junto a enumeraciones

En muchas ocasiones los condicionales SWITCH se emplean junto a enumeraciones, lo que permite mejorar mucho su legibilidad. Por ejemplo, el código anterior quedaría así,

enum DiaSemana
{
    Lunes, Martes, Miercoles, Jueves, Viernes, Sabado, Domingo
}

var dia = DiaSemana.Miercoles;
switch (dia)
{
    case DiaSemana.Lunes:
        // Acciones a realizar si es Lunes
        break;
    case DiaSemana.Martes:
        // Acciones a realizar si es Martes
        break;
    case DiaSemana.Miercoles:
        // Acciones a realizar si es Miercoles
        break;
    case DiaSemana.Jueves:
        // Acciones a realizar si es Jueves
        break;
    case DiaSemana.Viernes:
        // Acciones a realizar si es Viernes
        break;
    default:
        // Acciones a realizar si es Fin de semana
        break;
}

Un condicional polémico Consejos

El uso del condicional SWITCH ha generado cierta polémica y debate entre los desarrolladores. Existe una opinión que considera que el SWITCH no es necesario. Incluso hemos visto que lenguajes de programación modernos han optado por no incluirlo en su sintaxis.

En general, se considera una práctica algo anticuada. Para ciertos desarrolladores, el bloque equivalente en IF-ELSEIF es más legible. Además de más potente, ya que no tiene restricciones en cuanto a los condicionales a usar.

Por contra, hay otros desarrolladores que opinan que el condicional SWITCH ofrece una sintaxis más compacta y legible en casos donde se necesitan realizar múltiples comparaciones con una única variable

Además, el uso adecuado del condicional SWITCH puede mejorar el rendimiento del programa en comparación con estructuras IF-ELSEIF. Esto se debe a que el condicional SWITCH permite realizar una evaluación directa de los casos, evitando la necesidad de evaluar múltiples condiciones en cascada.

Bueno, supongo que para gustos los colores. Realmente no es un condicional que no es tan útil como parece, y actualmente está en desuso. Aunque, por otro lado, esta recobrando un nuevo auge gracias al pattern matching.

En cualquier caso, ahí lo tenéis explicado. Muchos lenguajes lo implementan, por lo que es interesante que, al menos, sepáis de su existencia y sepáis usarlo.