Ya vimos como se puede “traducir” de un proceso lógico, a sentencias en los lenguajes más comunes.
Sin embargo, esto, muy lineal, puede mejorarse utilizando las ventajas de los lenguajes. De eso va la publicación de hoy. Distintas formas de establecer lógica.
Los operadores lógicos.
La primera opción de mejora que tenemos, es la de combinar decisiones lógicas entre si: Esto es si tengo que preguntarme, por ejemplo, el tema de los meses:
En la publicación anterior, utilizamos 4 sentencias “if”, una detrás de otra. ¡Y sus respectivas acciones!
Sin embargo, podríamos encadenar las comparaciones, como diciendo: “si el mes es 4, o es 6, o es 9, o es 11…” y para eso sirven los operadores lógicos.
Esta tabla contiene los más comunes.
Operador | VB | C# | Detalles |
---|---|---|---|
Y | And | & | Si ambas condiciones se cumplen |
Y también | AndAlso | && | Si la primera se cumple se evalúa la segunda |
O | Or | | | Si una u otra |
O sino | OrElse | || | Si la primera se cumple, no se llega a evaluar la segunda |
O Excluyente | Xor | ^ | Solo una de las condiciones ha de ser verdadera |
NO | Not | ! | Negación de la condición |
Entonces, la codificación del ejemplo de la publicación, quedaría:
If mes < 1 OrElse mes > 12 OrElse día < 1 OrElse día < 1 OrElse día > 31 Then EsVálida = False Return EsVálida End If
if (mes < 1 || mes > 12 || día < 1 || día < 1 || día > 31) { EsVálida = false; return EsVálida; }
Encadenado de condiciones
A veces, no es cuestión de juntar condiciones, sino de establecer acciones dependiendo de distintas condiciones.
Si pasa esto, entonces hago a, pero si no pero pasa esto otro, entonces hago esto otro. A eso, lo podríamos denominar, “decisiones en cascada”.
Si la condición es if, y la acción por el opuesto es else, pero a su vez debo preguntar otra cosa, debería poner uno dentro del otro (anidado). Por ejemplo:
If condición1 Then Else If condición2 Then End If End If
Sin embargo, existen sentencias más precisas para esto:
If condición1 Then ElseIf condición2 Then End If
if (condición1) { } else if (condición2) { }
Selectores de valor
A veces, las decisiones pasan por coincidencias de una variable con ciertos valores y de acuerdo a ello, se toman distintas acciones (como con los meses de 30 días, por ejemplo). Para ello existen los “selectores de valor”. En ellos, se permite agrupar sentencias por ciertos valores específicos (uno o más), y además, se da la opción de realizar acciones cuando ninguno coincide.
Select Case variable Case valor1 acción1() Case valor2 acción2() Case valor3 accion3() Case Else accionExcluyente() End Select
switch (variable) { case valor1: acción1(); break; case valor2: acción2(); break; case valor3: accion3(); break; default: accionExcluyente(); break; }
Los selectores posibilitan además, que una misma acción se aplique a varios valores:
Select Case variable Case valor1, valor2 acción2() Case valor3 accion3() Case Else accionExcluyente() End Select
switch (variable) { case valor1: case valor2: acción2(); break; case valor3: accion3(); break; default: accionExcluyente(); break; }
A veces, se puede hacer “trampa” con los selectores. EL ejemplo de la validación de fecha es un buen caso: hay varios motivos distintos por los cuales una fecha puede ser inválida. Entonces, se puede codificar, dentro del Select, todas ellas. Pero … estamos comparando días y meses… son cosas distintas (“cerdos con velocidad al cuadrado”, decía mi padre ). Pero funciona.
Dim EsVálida As Boolean = True ' Selecciona cualquier caso que resulte verdadero Select Case True Case día < 1, día > 31, mes < 1, mes > 12 EsVálida = False Case mes = 4, EsVálida = 6, mes = 9, mes = 11 EsVálida = día < 31 Case mes = 2 If año Mod 4 = 0 Then EsVálida = día < 30 Else EsVálida = día < 29 End If End Select
Una Nota: Cuando una condición hace que la salida sea un valor verdadero o falso, no es necesario “encerrarlo” en un if. Como en la sentencia EsVálida = día < 30.
También, si debes preguntar si una variable contiene verdadero o falso, no cometas el error de preguntar si la variable es igual a verdadero. Más pasos del procesador para obtener el mismo resultado.
O sea, las dos sentencias que siguen, son idénticas… pero la de abajo es un poquito más rápida (se notará con muchos usos, no con uno solo).
If condición = True Then End If If condición Then End If
if (condición == true) { } if (condición) { }
En la próxima, hablaremos de bucles y repetidores.