Código espagueti

Compartir Imprimir Citar
Código fuente de software con mala estructura

Código espagueti es una frase peyorativa para código fuente desestructurado y difícil de mantener. El código de espagueti puede ser causado por 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.

Significado

El código que abusa de las declaraciones GOTO en lugar de construcciones de programación estructurada, lo que da como resultado programas intrincados e imposibles de mantener, a menudo se denomina código espagueti. Dicho código tiene una estructura de control compleja y enredada, lo que da como resultado un flujo de programa que es conceptualmente como un plato de espagueti, retorcido y enredado. 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". 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 la creación de clases cuyos métodos son demasiado largos y desordenados, o el abandono de conceptos orientados a objetos como el polimorfismo. La presencia de esta forma de código espagueti puede reducir significativamente la comprensibilidad de un sistema.

Historia

No está claro cuándo la frase código espagueti pasó a ser de uso común; sin embargo, aparecieron varias referencias en 1977, incluida Macaroni is Better Than Spaghetti de Guy Steele. En el libro de 1978 Un manual básico sobre programación disciplinada usando PL/I, PL/CS y PL/CT, Richard Conway usó el término para describir los tipos de programas que "tienen la misma lógica clara estructura como un plato de espagueti", una frase repetida en el libro de 1979 Una introducción a la programación del que es coautor con David Gries. En el documento de 1988 Un modelo en espiral de desarrollo y mejora de software, 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 a el desarrollo del modelo de cascada. En el libro de 1979 Programación estructurada para el programador COBOL, el autor Paul Noll usa las frases código espagueti y nido de ratas como sinónimos de describir un código fuente mal estructurado.

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 excepción restrictiva mecanismo de propagación.

En una parodia de lenguajes informáticos de 1981 en The Michigan Technic titulada "BÁSICAMENTE... ¡bytes de FORTRAN!", el autor describió FORTRAN afirmando que " consiste enteramente en código spaghetti".

Richard Hamming describió en sus conferencias la etimología del término en el contexto de la programación temprana en códigos binarios:

Si, al corregir un error, usted quería insertar algunas instrucciones omitidas entonces usted tomó la instrucción inmediatamente anterior y lo sustituyó por una transferencia a algún espacio vacío. Allí puso en la instrucción que acaba de escribir, agregó las instrucciones que quería insertar, y luego siguió una transferencia de nuevo al programa principal. Así el programa pronto se convirtió en una secuencia de saltos del control a lugares extraños. Cuando, como sucede casi siempre, hubo errores en las correcciones que luego utilizó 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 tomó la apariencia de una lata de espagueti. ¿Por qué no simplemente insertarlos en el funcionamiento de las 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! ¡Nada más que eso!

Frases relacionadas

Código de ravioles

El código Ravioli es un término específico de la programación orientada a objetos. Describe el código que comprende clases bien estructuradas que son fáciles de entender de forma aislada, pero difíciles de entender como un todo.

Código de lasaña

El código de lasaña se refiere al 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.

Ejemplos

Aquí sigue lo que se consideraría un ejemplo trivial de código espagueti en BASIC. El programa imprime en pantalla cada uno de los números del 1 al 100 junto con su cuadrado. La sangría no se usa para diferenciar las diversas acciones realizadas por el código, y las instrucciones GOTO del programa crean una dependencia en 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 PRINT i; "Squared=";i*i;4 IF i>=100 Entonces GOTO 6;5 GOTO 2;6 PRINT "Programa completado".;7 FIN

Aquí está el mismo código escrito en un estilo de programación estructurada:

1 PARA i=1 TO 1002 PRINT i;"Squared=";i*i3 NEXT i4 PRINT "Programa completado".5 FIN

El programa salta de un área a otra, pero este salto es formal y más fácilmente predecible, porque los bucles y funciones 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.

Este es otro ejemplo de código Spaghetti con sentencias GOTO incrustadas.

 INPUT "¿Cuántos números deben ser ordenados? "; T DIM n()T) PARA i = 1 TO T PRINT "NUMBER:"; i INPUT n()i) NEXT i 'Calculaciones: C = T E180: C = INT()C / 2) IF C = 0 Entonces GOTO C330 D = T - C E = 1 I220: f = E F230: g = f + C IF n()f)  n()g) Entonces SWAP n()f), n()g) f = f - C IF f  0 Entonces GOTO F230 E = E + 1 IF E  D Entonces GOTO E180 GOTO I220 C330: PRINT "La lista clasificada es" PARA i = 1 TO T PRINT n()i) NEXT i