# Código espagueti

El código espagueti es un término peyorativo para los programas de computación que tienen una estructura de control de flujo compleja e incomprensible. Su nombre deriva del hecho que este tipo de código parece asemejarse a un plato de espaguetis, es decir, un montón de hilos intrincados y anudados.
Tradicionalmente suele asociarse este estilo de programación con lenguajes básicos y antiguos, donde el flujo se controlaba mediante sentencias de control muy primitivas como goto y utilizando números de línea.

## Evolución de los lenguajes de programación

En los años 60 solo se podía definir el flujo de un programa a base de poner sentencias IF anidadas y variables booleanas para decidir la lógica. Más adelante ya se podían escribir funciones, de lo más general a lo más específico y en la actualidad con la programación orientada a objetos hay conceptos como la modularidad, abstracción, encapsulamiento, desacoplamiento, herencia, etc. Hay herramientas y conceptos más que suficientes como para evitar escribir este tipo de código.

## Refactorización

No es aceptable escribir código espagueti ni siquiera inicialmente ya que ello dificulta la comprensión del problema. Cuando durante el proceso de desarrollo de una función o programa se observa que la complejidad del código crece de forma que el código se está volviendo espagueti, es el momento de repasar la parte ya completada, lo que se conoce como refactorización. Esta limpieza periódica durante el desarrollo permite mantener la complejidad bajo control e incrementa significativamente la productividad del programador y comprensión del problema.

## De código espagueti a programación estructurada

Se puede dar una comparación con las reglas básicas del periodismo de como escribir una noticia. Estas indican que en el titular de la noticia tiene que mostrar la información más importante, a continuación entrar en detalle en el primer párrafo y después desglosar en los apartados subsecuentes. Así pues en el main del programa deben figurar las funciones más generales y cada una de ellas tiene que llamar a continuación a funciones más específicas.
Con "refactorizar - extraer método" se puede realizar automáticamente cada rama de los IF's del código espagueti se convierta en una función, mejorando mucho la visibilidad.

## De programación estructurada a programación orientada a objetos

Una vez se tienen las funciones claramente visibles es posible identificar cuales conforman una responsabilidad común y no entrelazada con el resto del código y por tanto es posible separarlas en objetos diferentes que ya tendrán los métodos y propiedades (que pueden ser privados, no visibles, desde el resto del código).

## Relacionado
### Código ravioli

Se refiere al código que está compuesto por clases bien estructuradas y fácilmente entendibles por separado, pero muy complicadas de entender como un todo.
El código ravioli se basa en que el código se refactoriza en demasiados trozos pequeños del mismo que llegan a ser difíciles o imposibles de seguir. Este caso se da también en la programación orientada a objetos, donde el origen del código ya no está disperso entre funciones o procedimientos, sino también entre clases y paquetes, haciendo que el código sea difícilmente trazable.

### Código lasaña

Se refiere al código cuyas capas son tan complicadas e interconectadas que un cambio en una requeriría cambios en otras.

### Código pizza

Se refiere al código que tiene una arquitectura muy plana.

### Código hotdog

Es aquel código que, al ser tan complicado, basta un pequeño error en el mismo para que todo el programa deje de funcionar.