El código espagueti es una frase peyorativa para código fuente no estructurado y difícil de mantener . El código espagueti puede deberse a varios factores, como requisitos de proyectos volátiles , falta de reglas de estilo de programación e ingenieros de software con capacidad o experiencia insuficientes. [1]
Significado
El código que usa en exceso declaraciones GOTO en lugar de construcciones de programación estructuradas , lo que da como resultado programas complicados y que no se pueden mantener, a menudo se denomina código espagueti. [2] 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 espaguetis , retorcido y enredado. [3] En una publicación de 1980 de la Oficina Nacional de Normas de los Estados Unidos , la frase programa de 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 desordenados, o renunciando a 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]
Historia
No está claro cuándo la frase código espagueti se volvió de uso común; sin embargo, varias referencias aparecieron en 1977 incluyendo Macaroni is Better Than Spaghetti de Guy Steele. [7] En el libro de 1978 Una introducción a la programación disciplinada usando PL / I, PL / CS y PL / CT , Richard Conway usó el término para describir tipos de programas que "tienen la misma estructura lógica limpia que un plato de espagueti". , [8] una frase repetida en el libro de 1979 Una introducción a la programación 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 usa 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 usa 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 - Europe '93 , Ada fue descrita como obligando al programador a "producir código comprensible, en lugar de espagueti", debido a su mecanismo de propagación de excepciones restrictivas. [12]
En una parodia de lenguajes de computadora de 1981 en The Michigan Technic titulada "Básicamente hablando ... ¡FORTRAN bytes!", El autor describió a FORTRAN diciendo 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, tomó la instrucción inmediatamente anterior y la reemplazó por una transferencia a algún espacio vacío. Allí, ingresó la instrucción que acaba de escribir, agregó las instrucciones que deseaba insertar y luego las transfirió 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, usó el mismo truco nuevamente, usando 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 la serie de instrucciones? ¡Porque entonces tendrías que repasar todo el programa y cambiar todas las direcciones que hacen referencia a cualquiera de las instrucciones movidas! ¡Todo menos 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. [15]
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. [dieciséis]
Ejemplos de
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 usa para diferenciar las diversas acciones realizadas por el código, y las GOTO
declaraciones 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 considerablemente los costos de mantenimiento de un programa.
1 i = 0 2 i = i + 1 3 IMPRIMIR i ; "cuadrado =" ; i * i 4 SI i > = 100 ENTONCES GOTO 6 5 GOTO 2 6 IMPRIMIR "Programa completado". 7 FIN
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 FIN
El programa salta de un área a otra, pero este salto es formal y más fácilmente predecible, porque los bucles for y las funciones proporcionan control de flujo mientras que la instrucció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.
INPUT "¿Cuántos números ordenar?" ; T DIM n ( T ) PARA i = 1 PARA T IMPRIMIR "NÚMERO:" ; i ENTRADA n ( i ) SIGUIENTE i 'Cálculos: C = T E180: C = INT ( C / 2 ) SI C = 0 ENTONCES GOTO 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 GOTO F230 E = E + 1 SI E > D ENTONCES GOTO E180 GOTO I220 C330: IMPRIMIR "La lista ordenada es" PARA i = 1 PARA T IMPRIMIR n ( i ) SIGUIENTE i
Ver también
- Gran bola de barro , un software sin arquitectura perceptible
- Concurso internacional de código C ofuscado , un concurso para producir código C agradablemente oscuro
- Lenguaje de solo escritura , un lenguaje con una sintaxis tan extraña que el código resultante es incomprensible
- Deuda técnica
Referencias
- ^ Markus, Pizka (2004). "¿Enderezar el código de espagueti con refactorización?" (PDF) . Investigación y práctica de ingeniería de software : 846–852 . Consultado el 5 de marzo de 2018 .
- ^ Cram, David; Hedley, Paul (2005). "Pronombres y significado procedimental: la relevancia del código espagueti y delirio paranoico" (PDF) . Documentos de trabajo de la Universidad de Oxford en lingüística, filología y fonética . 10 : 187–210 . Consultado el 5 de marzo de 2018 .
- ^ Horstmann, Cay (2008). "Capítulo 6 - Iteración" . Conceptos de Java para Ciencias de la Computación AP (5ª ed. [Es decir, 2ª ed.]. Ed.). Hoboken, Nueva Jersey: J. Wiley & Sons. págs. 235-236. ISBN 978-0-470-18160-7. Consultado el 2 de enero de 2017 .
- ^ Oficina Nacional de Normas de los Estados Unidos (1980). Publicación técnica especial de ASTM . Oficina de Imprenta del Gobierno de los Estados Unidos.
- ^ Moha, N .; Gueheneuc, YG; Duchien, L .; Meur, AF Le (enero de 2010). "DECORACIÓN: un método para la especificación y detección de olores de código y diseño". Transacciones IEEE sobre ingeniería de software . 36 (1): 20–36. CiteSeerX 10.1.1.156.1524 . doi : 10.1109 / TSE.2009.50 . ISSN 0098-5589 .
- ^ Abbes, M .; Khomh, F .; Gueheneuc, YG; Antoniol, G. (2011). Un estudio empírico del impacto de dos antipatrones, Blob y Spaghetti Code, en la comprensión del programa . 2011 XV Congreso Europeo de Mantenimiento y Reingeniería de Software . págs. 181-190. CiteSeerX 10.1.1.294.1685 . doi : 10.1109 / CSMR.2011.24 . ISBN 978-1-61284-259-2.
- ^ Guy Lewis Steele. 1977. Los macarrones son mejores que los espaguetis. En Actas del simposio de 1977 sobre inteligencia artificial y lenguajes de programación. Association for Computing Machinery, Nueva York, NY, EE. UU., 60–66. DOI: https://doi.org/10.1145/800228.806933
- ^ Conway, Richard (1978). Una introducción a la programación disciplinada utilizando PL / I, PL / CS y PL / CT . Editores de Winthrop. ISBN 978-0-87626-712-7.
- ^ Conway, Richard; Gries, David (1979). Introducción a la programación (3ª ed.). Pequeño, Brown. ISBN 978-0-316-15414-7.
- ^ Boehm, Barry W. (mayo de 1988). "Un modelo en espiral de desarrollo y mejora de software". Computadora IEEE . 21 (2): 61–72. doi : 10.1109 / 2.59 .
- ^ Noll, Paul (1977). Programación estructurada para el programador COBOL: diseño, documentación, codificación, testeo . M. Murach y asociados.
- ^ Schwille, Jürgen (1993). "Uso y abuso de excepciones - 12 pautas para el manejo adecuado de excepciones". Apuntes de conferencias en Ciencias de la Computación . Ada - Europe '93 (Actas). 688 . Springer Berlín Heidelberg. págs. 142-152. doi : 10.1007 / 3-540-56802-6_12 .
- ^ MTSBS [ aclaración necesaria ] (marzo-abril de 1981). "Básicamente hablando ... ¡¡FORTRAN bytes !!". La técnica de Michigan . 99 (4).CS1 maint: varios nombres: lista de autores ( enlace )
- ^ Hamming, Richard (1996). El arte de hacer ciencia e ingeniería . ISBN 9056995006.
- ^ Troyer, O. De (13 de mayo de 1991). El modelo de relación OO-binario: un modelo conceptual verdaderamente orientado a objetos . Ingeniería de Sistemas de Información Avanzada . Notas sobre Mecánica de Fluidos Numérica y Diseño Multidisciplinario. 141 . págs. 561–578. doi : 10.1007 / 3-540-54059-8_104 . ISBN 978-3-319-98176-5.
- ^ Tomov, Latchezar; Ivanova, Valentina (octubre de 2014). "Enseñanza de Buenas Prácticas en Ingeniería de Software por Contraejemplos" . Ciencias de la computación y educación en ciencias de la computación (1): 397–405 . Consultado el 5 de marzo de 2018 .
enlaces externos
- Ir a la declaración considerada nociva . El clásico repudio del código espagueti de Edsger Dijkstra
- No sabemos adónde ir si no sabemos de dónde venimos por R. Lawrence Clark de DATAMATION, diciembre de 1973
- Refactorización del código espagueti de Java en código bento de Java separando un cuenco lleno de código de una clase en siete clases
- Objetos y marcos: dar un paso atrás por Brian Rinaldi
- Programación de Pasta - Código de espaguetis, lasaña, ravioles y macarrones
- Teoría de la programación de Pasta
- Código espagueti: desenredar la vida y el trabajo con la sabiduría del programador (edición en inglés)