Código espagueti, el paradigma de programación más usado

Código espagueti

Tal vez hayas escuchado alguna vez hablar sobre el término spaghetti code o código espagueti. O tal vez no lo hayas oido nunca, pero estoy seguro de que alguna vez has escrito código así.

Se trata de un término que principalmente es peyorativo, y hace referencia a código mal escrito, cuyo flujo de ejecución es confuso y prácticamente incomprensible.

En los últimos años el concepto ha ido evolucionando, y es habitual usar el término para referirse a código difícil de leer en general, mal identado y uso de funciones o líneas demasiado largas.

Lo mejor de todo, es que en la jerga de la programación existen toda una variedad de maneras de describir códigos con diferentes platos:

  • Código ravioli: Hace referencia a código estructurado en clases, que pueden ser entendidas por separado, pero muy difíciles de entender como un todo.
  • Código lasaña: Se refiere a código estructurado en capas con dependencias entre sí, por lo que un cambio en una capa requerirá realizar cambios en otras.
  • Código pizza: Hace referencia a código con una arquitectura muy plana.

Como evitarlo

No hay una regla de oro, e incluso algunos profesionales a veces acaban escribiendo código espagueti, pero aquí van algunas directrices:

  • Evita escribir funciones muy largas y divide el código en bloques funcionales claramente identificados. Un bloque tiene que hacer una sola cosa bien definida.
  • Evita pasar gran número de argumentos a las funciones. Si tienes una función que recibe 20 argumentos, probablemente estés haciendo algo mal. Lo mismo con los valores de retorno.
  • Evita en la medida de lo posible el uso de variables globales.
  • Intenta usar abstracciones.
  • Cuidado con el uso de muchos break y continue.
  • Aplica métodos como DRY (Don't Repeat Yourself) o KISS (Keep It Simple Stupid). Pueden parecer triviales pero a veces la mejor solución es la más sencilla. Repetir código tampoco es una opción.

Proyectos interesantes

Un ejemplo que va algo más allá del simple código espagueti es el proyecto is-thirteen, que lleva el concepto a otro nivel.

Se trata de una librería para javascript, cuya única funcionalidad es verificar si un número es igual a 13. Nuestros seguidores sabrán perfectamente que en Python se hace así.

x == 13

Pero este proyecto lo lleva un nivel más allá. Se define toda una librería en la que han colaborado más de 100 desarrolladores hasta la fecha y con miles de estrellas en GitHub. La tarea es de lo más sencilla y trivial, algo que podría escribirse en una línea de código en casi cualquier lenguaje de programación.

Los usuarios comentan cosas de lo más graciosas en la sección de issues. Sobra decir que se trata de un repositorio de broma, pero estos son algunos de los comentarios:

Parece que hay gente pidiendo soporte para una nueva funcionalidad. Comprobar si un número es 16.

Need support for isSixteen

Otro usuario quiere que se puedan comparar números binarios.

Please add binary support "0b1101"

Gente incluso pidiendo que se genere un contenedor.

Can we have this as a Docker container?

Y como no, la palabra clave en la industria. Alguien quiere añadir deep learning a la librería.

Add deep learning

Este proyecto nos puede servir para ver lo que se pueden complicar las cosas en el mundo del software. Complicaciones que a menudo son totalmente innecesarias.

Ejemplos en Python

Y no podíamos acabar el post sin mostrar unos ejemplos del mejor código espagueti en Python.

Queremos una función que nos devuelva el nombre de un mes dado el número (2=Febrero). Podemos hacer lo siguiente.

def numero_a_mes(mes):
    if mes == 1:
        return "Enero"
    if mes == 2:
        return "Febrero"
    if mes == 3:
        return "Marzo"
    if mes == 4:
        return "Abril"
    if mes == 5:
        return "Mayo"
    if mes == 6:
        return "Junio"
    if mes == 7:
        return "Julio"
    if mes == 8:
        return "Agosto"
    if mes == 9:
        return "Septiembre"
    if mes == 10:
        return "Octubre"
    if mes == 11:
        return "Noviembre"
    if mes == 12:
        return "Diciembre"

Pero ¿no sería más fácil lo siguiente?

def numero_a_mes(mes):
    lista = ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio",
             "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"]
    return lista[5-1]

No muy real pero otra buena barbaridad sería el siguiente ejemplo. El objetivo es saber si un número es mayor que cero.

import math
def es_negativo(n):
    try:
        math.sqrt(n)
        return False
    except:
        return True

Para ello se intenta calcular su raíz cuadrada, y si da error (lo dará para números negativos), se devuelve que es negativo. Buena burrada.

Y tú, ¿cuál es el mejor código que has visto?
Estaríamos encantados de recibir vuestros códigos espagueti en los comentarios y añadirlos al post.

¡Deja un comentario!

avatar
  Subscribe  
Notify of