El código espagueti es una expresión peyorativa que hace referencia a un código fuente informático desestructurado y difícil de mantener . El desarrollo de un código con una estructura deficiente puede deberse a varios factores, como requisitos de proyecto volátiles, falta de reglas de estilo de programación e ingenieros de software con capacidad o experiencia insuficientes. [1]
El código que hace un uso excesivo de las instrucciones GOTO en lugar de construcciones de programación estructurada , lo que da como resultado programas enrevesados y difíciles de mantener, a menudo se denomina código espagueti. [2] Este tipo de código tiene una estructura de control compleja y enredada , lo que da como resultado un flujo de programa que conceptualmente es como un tazón de espagueti , retorcido y enredado. [3]
En una publicación de 1980 de la Oficina Nacional de Normas de los Estados Unidos , se utilizó la frase " programa espagueti" para describir programas más antiguos que tenían "archivos fragmentados y dispersos". [4]
El código espagueti también puede describir un antipatrón en el que el código orientado a objetos se escribe en un estilo procedimental, como al crear clases cuyos métodos son demasiado largos y desordenados, o al abandonar conceptos orientados a objetos como el polimorfismo . [5] La presencia de esta forma de código espagueti puede reducir significativamente la comprensibilidad de un sistema. [6]
No está claro cuándo la frase código espagueti se volvió de uso común; sin embargo, aparecieron varias referencias en 1977, incluyendo Macaroni is Better Than Spaghetti de Guy Steele . [7] En el libro de 1978 A primer on disciplined programming using PL/I, PL/CS, and PL/CT , Richard Conway describió programas que "tienen la misma estructura lógica limpia que un plato de espaguetis", [8] una frase repetida en el libro de 1979 An Introduction to Programming que coescribió con David Gries . [9] En el artículo de 1988 A spiral model of software development and enhancement , el término se usa para describir la práctica más antigua del modelo de código y corrección , que carecía de planificación y eventualmente condujo al desarrollo del modelo en cascada . [10] En el libro de 1979 Structured programming for the COBOL programmer , el autor Paul Noll usa las frases código espagueti y nido de ratas como sinónimos para describir código fuente mal estructurado. [11]
En la conferencia Ada – Europa '93 , se describió a Ada como un sistema que obliga al programador a "producir código comprensible, en lugar de espagueti", debido a su restrictivo mecanismo de propagación de excepciones. [12]
En una parodia de lenguajes informáticos de 1981 en The Michigan Technic titulada "BÁSICAMENTE hablando... ¡bytes de FORTRAN!", el autor describió FORTRAN afirmando que "consiste completamente en código espagueti". [13]
Richard Hamming describió en sus conferencias [14] la etimología del término en el contexto de la programación temprana en códigos binarios:
Si, al corregir un error, querías insertar algunas instrucciones omitidas, tomabas la instrucción inmediatamente anterior y la reemplazabas por una transferencia a algún espacio vacío. Allí ponías la instrucción que acababas de escribir, añadías las instrucciones que querías insertar y luego seguías con una transferencia de vuelta al programa principal. Así, el programa pronto se convertía en una secuencia de saltos del control a lugares extraños. Cuando, como casi siempre ocurre, había errores en las correcciones, utilizabas el mismo truco de nuevo, utilizando algún otro espacio disponible. Como resultado, la ruta de control del programa a través del almacenamiento pronto adquirió la apariencia de una lata de espaguetis. ¿Por qué no insertarlas simplemente en la serie de instrucciones? ¡Porque entonces tendrías que revisar todo el programa y cambiar todas las direcciones que se referían a cualquiera de las instrucciones movidas! ¡Cualquier cosa menos eso!
El código ravioli es un término específico de la programación orientada a objetos . Describe un código que comprende clases bien estructuradas que son fáciles de entender de forma aislada, pero difíciles de entender en su conjunto. [15]
El código lasaña se refiere a un código cuyas capas son tan complicadas y entrelazadas que hacer un cambio en una capa requeriría cambios en todas las demás capas. [16]
A continuación se muestra lo que se consideraría un ejemplo trivial de código espagueti en BASIC . El programa imprime cada uno de los números del 1 al 100 en la pantalla junto con su cuadrado. No se utiliza sangría para diferenciar las distintas acciones realizadas por el código, y las GOTO
instrucciones del programa crean una dependencia de los números de línea . El flujo de ejecución de un área a otra es más difícil de predecir. Las ocurrencias del código espagueti en el mundo real son más complejas y pueden aumentar en gran medida los costos de mantenimiento de un programa.
1 i = 0 2 i = i + 1 3 IMPRIMIR i ; "al cuadrado=" ; i * i 4 SI i >= 100 ENTONCES IR A 6 5 IR A 2 6 IMPRIMIR "Programa completado". 7 FIN
Aquí está el mismo código escrito en un estilo de programación estructurada :
1 FOR i = 1 TO 100 2 PRINT i ; "al cuadrado=" ; i * i 3 NEXT i 4 PRINT "Programa completado". 5 END
El programa salta de un área a otra, pero este salto es formal y más fácil de predecir, porque los bucles y las funciones for proporcionan control de flujo mientras que la declaración goto fomenta un control de flujo arbitrario. Aunque este ejemplo es pequeño, los programas del mundo real se componen de muchas líneas de código y son difíciles de mantener cuando se escriben en forma de código espagueti.
A continuación se muestra otro ejemplo de código espagueti con instrucciones GOTO integradas.
INPUT "¿Cuántos números se deben ordenar?" ; T DIM n ( T ) PARA i = 1 PARA T PRINT "NÚMERO:" ; i INPUT n ( i ) SIGUIENTE i 'Cálculos: C = T E180: C = INT ( C / 2 ) SI C = 0 ENTONCES IR A C330 D = T - C E = 1 I220: f = E F230: g = f + C SI n ( f ) > n ( g ) ENTONCES INTERCAMBIAR n ( f ), n ( g ) f = f - C SI f > 0 ENTONCES IR A F230 E = E + 1 SI E > D ENTONCES IR A E180 IR A I220 C330: PRINT "La lista ordenada es" PARA i = 1 PARA T PRINT n ( i ) SIGUIENTE i
{{cite journal}}
: CS1 maint: nombres múltiples: lista de autores ( enlace ) CS1 maint: nombres numéricos: lista de autores ( enlace )