Código espagueti es una frase peyorativa para referirse al código fuente no estructurado y difícil de mantener . El código espagueti puede deberse a varios factores, como requisitos volátiles del proyecto, falta de reglas de estilo de programación e ingenieros de software con capacidad o experiencia insuficientes. [1]
El código que abusa de declaraciones GOTO en lugar de construcciones de programación estructuradas , lo que da como resultado programas complicados e imposibles de mantener, a menudo se denomina código espagueti. [2] Dicho código tiene una estructura de control compleja y enredada , lo que resulta en un flujo de programa que es conceptualmente como un plato de espaguetis , retorcido y enredado. [3]
En una publicación de 1980 de la Oficina Nacional de Estándares de los Estados Unidos , la frase programa espagueti se utilizó 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 creando clases cuyos métodos son demasiado largos y confusos, o abandonando 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 se volvió de uso común la frase código espagueti; sin embargo, en 1977 aparecieron varias referencias, incluida Macaroni is Better Than Spaghetti de Guy Steele . [7] En el libro de 1978 Introducción a la programación disciplinada utilizando PL/I, PL/CS y PL/CT , Richard Conway describió programas que "tienen la misma estructura lógica limpia que un plato de espaguetis", [8] una frase repetido en el libro de 1979 Introducción a la programación del que fue coautor con David Gries . [9] En el artículo de 1988 Un modelo en espiral de desarrollo y mejora de software , el término se utiliza para describir la práctica más antigua del modelo de código y corrección , que carecía de planificación y finalmente condujo al desarrollo del modelo en cascada . [10] En el libro de 1979 Programación estructurada para el programador COBOL , el autor Paul Noll utiliza las frases código espagueti y nido de ratas como sinónimos para describir un código fuente mal estructurado. [11]
En la conferencia Ada - Europa '93 , se describió que Ada obligaba 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 enteramente 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, deseaba insertar algunas instrucciones omitidas, tomaba la instrucción inmediatamente anterior y la reemplazaba por una transferencia a algún espacio vacío. Allí ingresa las instrucciones que acaba de escribir, agrega las instrucciones que desea insertar y luego realiza una transferencia de regreso al programa principal. Así el programa pronto se convirtió en una secuencia de saltos del mando a lugares extraños. Cuando, como casi siempre ocurre, había errores en las correcciones se volvía a utilizar el mismo truco, utilizando algún otro espacio disponible. Como resultado, el recorrido de control del programa hasta el almacenamiento pronto tomó el aspecto de una lata de espaguetis. ¿Por qué no simplemente insertarlos en el conjunto de instrucciones? ¡Porque entonces tendrías que revisar todo el programa y cambiar todas las direcciones que hacen referencia a cualquiera de las instrucciones movidas! ¡Todo menos eso!
El código Ravioli es un término específico de la programación orientada a objetos . Describe 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 de 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. [dieciséis]
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. La sangría no se utiliza para diferenciar las diversas acciones realizadas por el código y las GOTO
declaraciones del programa dependen 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 apariciones de código espagueti en el mundo real son más complejas y pueden aumentar enormemente los costos de mantenimiento de un programa.
1 yo = 0 ; 2 yo = yo + 1 ; 3 IMPRIMIR i ; "cuadrado=" ; yo * yo ; 4 SI i >= 100 ENTONCES IR A 6 ; 5 IR A 2 ; 6 IMPRIMIR "Programa completado". ; 7 FINAL
Aquí está el mismo código escrito en un estilo de programación estructurado :
1 PARA i = 1 A 100 2 IMPRIMIR i ; "cuadrado=" ; i * i 3 SIGUIENTE i 4 IMPRIMIR "Programa completado". 5 FINAL
El programa salta de un área a otra, pero este salto es formal y más fácilmente predecible, porque los bucles y funciones for proporcionan control de flujo , mientras que la declaración goto fomenta el 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.
Aquí hay otro ejemplo de código Spaghetti con declaraciones GOTO incrustadas.
ENTRADA "¿Cuántos números se deben ordenar?" ; T DIM n ( T ) FOR i = 1 A T IMPRIMIR "NÚMERO:" ; i ENTRADA 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: IMPRIMIR "La lista ordenada es" FOR i = 1 TO T IMPRIMIR n ( i ) SIGUIENTE i
{{cite journal}}
: CS1 maint: multiple names: authors list (link) CS1 maint: numeric names: authors list (link){{cite book}}
: |journal=
ignorado ( ayuda ) ; Falta o está vacío |title=
( ayuda )