IFs anidados, UNLESS y COND

Pequeña reseña del condicional UNLESS, que es como el condicional IF pero al revés, y luego lo más relevante, el condicional COND, que sirve para fabricar tablas de condicionales más concisas que usar IFs anidados.

En Elixir, además del condicional if que ya conocemos, contamos con una alternativa muy interesante llamada unless. Esta construcción es prácticamente un if invertido: ejecuta el bloque de código cuando la condición es falsa o nil. Por ejemplo, si queremos mostrar un mensaje cuando un usuario no es administrador, en lugar de escribir un if not admin, podemos usar directamente unless admin. Esto hace que el código sea más legible en casos donde queremos actuar sobre la negación de una condición.

El unless también acepta un bloque else, que se ejecuta cuando la condición es verdadera. Aunque es útil, su uso puede ser polémico, ya que algunos programadores prefieren evitarlo por la inversión lógica que implica, lo que puede dificultar la comprensión en ciertos contextos. Sin embargo, cuando se usa con moderación, puede simplificar la lectura del código.

Cuando necesitamos manejar múltiples condiciones, anidar varios if puede volverse complicado y poco legible. Por ejemplo, imaginemos que tenemos un valor que representa la cantidad de lluvia y queremos mostrar diferentes mensajes según distintos rangos. Podríamos escribir varios if anidados para cubrir cada caso, pero esto hace que el código crezca en longitud y se vuelva difícil de seguir.

Para resolver este problema, Elixir ofrece la construcción cond, que funciona como una tabla de condiciones evaluadas secuencialmente. Cada condición se escribe seguida de una flecha -> y la expresión que se debe devolver si esa condición se cumple. Por ejemplo, para nuestro caso de la lluvia, podríamos escribir:

mensaje = cond do
  lluvia == 0 -> "no ha llovido"
  lluvia < 30 -> "ha llovido un poco"
  lluvia < 60 -> "ha llovido un rato"
  lluvia < 90 -> "ha llovido bastante"
  true -> "madre de Dios la que ha caído"
end

El cond evalúa las condiciones de arriba hacia abajo y ejecuta la expresión correspondiente a la primera condición verdadera. Es importante incluir una condición final que siempre sea verdadera, como true, para manejar casos que no encajen en las condiciones anteriores y evitar que el programa falle.

El orden de las condiciones en cond es crucial. Si colocamos primero una condición muy general, como true, esta se cumplirá siempre y las condiciones posteriores nunca se evaluarán. Por eso, debemos ordenar las condiciones de la más específica a la más general para que el flujo lógico sea correcto.

Esta estructura nos permite escribir código más limpio y fácil de entender, evitando la complejidad de los if anidados y facilitando la gestión de múltiples casos en función de diferentes condiciones. Además, la sintaxis clara y concisa de cond es una muestra del poder expresivo de Elixir para manejar lógica condicional de forma elegante.

Lista de reproducción
  1. 1
    ¿Qué es Elixir?
    10 minutos
  2. 2
    Instalación de Elixir
    9 minutos
  3. 3
    ¿Qué es la programación funcional? (Como la de Elixir)
    20 minutos
  4. 4
    ¿Cómo funciona la REPL de Elixir?
    7 minutos
  5. 5
    ¿Cómo hacer asignaciones en Elixir?
    7 minutos
  6. 6
    Operadores aritméticos básicos
    6 minutos
  7. 7
    ¿Qué son los tipos de datos de Elixir?
    5 minutos
  8. 8
    Átomos en Elixir
    4 minutos
  9. 9
    Las palabras clave nil, true y false
    6 minutos
  10. 10
    Operadores lógicos de comparación
    8 minutos
  11. 11
    Comparación estricta con ===
    3 minutos
  12. 12
    Operadores lógicos y proposicionales
    8 minutos
  13. 13
    Invocación de funciones
    10 minutos
  14. 14
    Fundamentos de funciones
    9 minutos
  15. 15
    Cadenas de caracteres
    8 minutos
  16. 16
    Entrada y salida estandar de la mano de gets y puts
    9 minutos
  17. 17
    Concatenar e interpolar strings
    9 minutos
  18. 18
    Código fuente en archivos
    9 minutos
  19. 19
    Condicional IF y bloques DO-END
    11 minutos
  20. 20
    IFs anidados, UNLESS y COND
    12 minutos
  21. 21
    Definición de funciones
    11 minutos
  22. 22
    Fundamentos de compilación de módulos
    6 minutos
  23. 23
    Guardas
    8 minutos
  24. 24
    Funciones anónimas
    7 minutos
  25. 25
    Capturar funciones
    4 minutos
  26. 26
    Invocación de funciones dentro del mismo módulo
    7 minutos
  27. 27
    Tuplas
    8 minutos
  28. 28
    Introducción al pattern matching
    8 minutos
  29. 29
    Pattern matching en funciones
    11 minutos
  30. 30
    Las tuplas :ok, :error
    7 minutos
  31. 31
    case
    10 minutos
  32. 32
    Operador pin
    7 minutos
  33. 33
    Pattern matchings y recursividad
    5 minutos
  34. 34
    Listas
    9 minutos
  35. 35
    Operadores y funciones de lista
    10 minutos
  36. 36
    Keyword lists: listas de palabras clave
    8 minutos
  37. 37
    Mapas
    7 minutos
  38. 38
    Pattern matching de mapas y keyword lists
    6 minutos
  39. 39
    Operadores y funciones para mapas y keyword lists
    5 minutos
  40. 40
    Estructuras con defstruct
    11 minutos
  41. 41
    Bitstrings
    11 minutos
  42. 42
    Charlists
    10 minutos
  43. 43
    Funciones de alto orden en Elixir
    5 minutos
  44. 44
    Uso de la función filter
    10 minutos
  45. 45
    Uso de la función map
    7 minutos
  46. 46
    Uso de la función reduce
    9 minutos
  47. 47
    Pipelines
    11 minutos
  48. 48
    Rangos y Streams
    11 minutos
  49. 49
    Funciones recursivas con listas
    14 minutos