
El código espagueti es un código fuente de computadora que codifica un flujo de control enrevesado y, por lo tanto, difícil de entender. Las instrucciones de control dirigen la ejecución del programa de maneras que, en lugar de tener una calidad de estructura, se asemejan a espaguetis cocidos , retorcidos y enredados . [ 1 ] El código tiende a ser difícil de mantener .
Dado que la lógica de control de flujo codificada mediante la instrucción goto tiende a generar un flujo de control complejo, su uso suele asociarse con la clasificación de código espagueti. [ 2 ] La práctica de la programación estructurada se concibió para eliminar la necesidad y el uso de la instrucción goto como una forma de evitar la producción de código espagueti. Garantizar la creación de software de alta calidad , en lugar de código espagueti, a menudo implica aspectos como el uso de mejores herramientas , la capacitación de desarrolladores y la mejora de los procesos de desarrollo de software . [ 3 ]
El código espagueti también puede describir un antipatrón en el que el código orientado a objetos se escribe de forma procedimental, por ejemplo, creando clases cuyos métodos son excesivamente largos y desordenados, o renunciando a conceptos orientados a objetos como el polimorfismo . [ 4 ] La presencia de esta forma de código espagueti puede reducir significativamente la comprensibilidad de un sistema. [ 5 ]
Historia
No está claro cuándo se acuñó la frase código espagueti . Martin Hopkins hizo una referencia temprana al espagueti en este contexto en 1972, escribiendo que la "motivación principal detrás de eliminar la instrucción goto es la esperanza de que los programas resultantes no parezcan un plato de espaguetis". [ 6 ] 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", [ 7 ] una frase repetida en el libro de 1979 An Introduction to Programming que coescribió con David Gries . [ 8 ] En el artículo de 1988 A spiral model of software development and enhancement , el término se usa para describir la práctica anterior del modelo de código y corrección , que carecía de planificación y finalmente condujo al desarrollo del modelo de cascada . [ 9 ] 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. [ 10 ]
En la conferencia Ada – Europe '93 , se describió a Ada como un sistema que obligaba al programador a "producir código comprensible, en lugar de código espagueti", debido a su restrictivo mecanismo de propagación de excepciones. [ 11 ]
En una publicación de 1980 de la Oficina Nacional de Estándares de los Estados Unidos , la frase " programa espagueti " se usó para describir programas antiguos que tenían "archivos fragmentados y dispersos". [ 12 ]
En una parodia de lenguajes informáticos de 1981 publicada 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, querías insertar instrucciones omitidas, tomabas la instrucción inmediatamente anterior y la reemplazabas con una transferencia a un espacio vacío. Allí colocabas la instrucción que acababas de sobrescribir, añadías las instrucciones que querías insertar y, a continuación, volvías a transferir la instrucción al programa principal. De este modo, el programa pronto se convertía en una secuencia de saltos de control a lugares extraños. Cuando, como casi siempre ocurre, había errores en las correcciones, volvías a usar el mismo truco, utilizando otro espacio disponible. Como resultado, la ruta de control del programa a través del almacenamiento pronto se convertía en un auténtico laberinto. ¿Por qué no simplemente insertarlas en la secuencia de instrucciones? ¡Porque entonces tendrías que recorrer todo el programa y cambiar todas las direcciones que hacían referencia a cualquiera de las instrucciones movidas! ¡Cualquier cosa menos eso!
Ejemplos
Simple
El siguiente código BASIC , un programa que imprime los números del 1 al 100, es un ejemplo relativamente sencillo de código que se comprende mejor con un flujo de control estructurado en lugar de usar goto. El uso de GOTObucles for y la falta de indentación dan como resultado una lógica poco clara.
10 i = 0 20 i = i + 1 30 IMPRIMIR i 40 SI i >= 100 ENTONCES IR A 60 50 IR A 20 60 FINEl siguiente código produce el mismo resultado, pero utiliza una estructura de bucle y sangría para mejorar la legibilidad.
10 PARA i = 1 HASTA 100 20 IMPRIMIR i 30 SIGUIENTE i 40 FINMás representativo
El siguiente código implementa un algoritmo de ordenación numérica . El uso de instrucciones goto da como resultado un flujo de control enmarañado.
ENTRADA "¿Cuántos números deben ordenarse?" ; T DIM n ( T ) PARA i = 1 HASTA 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" PARA i = 1 HASTA T IMPRIMIR n ( i ) SIGUIENTE iRelacionado
Gran bola de barro
Un sistema de software sin una arquitectura definida es un sistema de software que carece de una arquitectura perceptible. Si bien no es deseable desde el punto de vista de la ingeniería de software, estos sistemas son comunes en la práctica debido a las presiones comerciales, la rotación de desarrolladores y la entropía del software . El término fue popularizado por Brian Foote y Joseph Yoder, aunque atribuyen su acuñación a Brian Marick. [ 15 ]
Un sistema caótico y desordenado es una maraña de código enredado, con una estructura caótica, desorganizada y caótica, hecha con cinta adhesiva y alambre. Estos sistemas muestran claros signos de crecimiento descontrolado y reparaciones repetidas y oportunistas. La información se comparte indiscriminadamente entre elementos distantes del sistema, a menudo hasta el punto de que casi toda la información importante se vuelve global o se duplica.
Es posible que la estructura general del sistema nunca haya estado bien definida.
Si lo fuera, probablemente se habría deteriorado hasta quedar irreconocible. Los programadores con un mínimo de sensibilidad arquitectónica evitan estos atolladeros. Solo aquellos a quienes no les preocupa la arquitectura y, tal vez, se sienten cómodos con la inercia de la tarea diaria de tapar las grietas en estos diques defectuosos, se contentan con trabajar en tales sistemas.
— Brian Foote y Joseph Yoder, Big Ball of Mud. Cuarta Conferencia sobre Patrones y Lenguajes de Programación (PLoP '97/EuroPLoP '97), Monticello, Illinois, septiembre de 1997.
Relacionado con la pasta
Inspirados por la popularidad del código espagueti , otros términos relacionados con la pasta que describen la naturaleza estructural del código incluyen:
- Código de lasaña
- El código Lasagna tiene capas tan entrelazadas que hacer un cambio en una capa requiere cambiar también otras capas. [ 16 ]
- Código de ravioles
- El código Ravioli se compone de clases bien estructuradas que son fáciles de entender de forma aislada, pero que en combinación dan como resultado un diseño de sistema poco claro. [ 17 ]
Véase también
- Mal olor del código : característica del código fuente que sugiere un problema de calidad.
- Los elementos del estilo de programación – Libro de 1978 de Brian W. Kernighan y PJ Plauger
- Concurso Internacional de Código C Ofuscado : Concurso para producir código informático críptico.
- Fragilidad del software : descripción de la dificultad para modificar el software.
- Mantenimiento de software : modificación del software después de la entrega.
- SQALE
- Deuda técnica : costo de mantener un sistema de baja calidad.
Referencias
- ↑ Horstmann, Cay (2008). «Capítulo 6 - Iteración» . Java Concepts for AP Computer Science (5.ª ed. [es decir, 2.ª ed.] ). Hoboken, NJ: J. Wiley & Sons. págs. 235–236 . ISBN 978-0-470-18160-7Consultado el 2 de enero de 2017 .
- ↑ Cram, David; Hedley, Paul (2005). «Pronombres y significado procedimental: la relevancia del código espagueti y el delirio paranoide» (PDF) . Documentos de trabajo de la Universidad de Oxford en lingüística, filología y fonética . 10 : 187–210 . Archivado del original (PDF) el 6 de marzo de 2018. Recuperado el 5 de marzo de 2018 .
- ↑ Markus, Pizka (2004). "¿Enderezando el código espagueti con refactorización?" (PDF) . Software Engineering Research and Practice : 846–852 . Archivado del original (PDF) el 5 de marzo de 2018. Recuperado el 5 de marzo de 2018 .
- ↑ Moha, N.; Gueheneuc, YG; Duchien, L.; Meur, AF Le (enero de 2010). "DECOR: Un método para la especificación y detección de olores de código y diseño". IEEE Transactions on Software Engineering . 36 (1): 20– 36. Bibcode : 2010ITSEn..36...20M . CiteSeerX 10.1.1.156.1524 . doi : 10.1109/TSE.2009.50 . ISSN 0098-5589 . S2CID 14767901 .
- ↑ 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 de programas". 15.ª Conferencia Europea de Mantenimiento y Reingeniería de Software de 2011. pp. 181–190 . CiteSeerX 10.1.1.294.1685 . doi : 10.1109/CSMR.2011.24 . ISBN 978-1-61284-259-2. S2CID 14152638 .
- ↑ Hopkins, ME (1972): Un caso para el GOTO. En: ACM '72: Actas de la conferencia anual de la ACM - Volumen 2, agosto de 1972, pp. 787–790, p. 59 DOI: https://dl.acm.org/doi/10.1145/800194.805860
- ↑ Conway, Richard (1978). Introducción a la programación disciplinada con PL/I, PL/CS y PL/CT . Winthrop Publishers. ISBN 978-0-87626-712-7.
- ↑ Conway, Richard; Gries, David (1979). Introducción a la programación (3.ª ed.). Little, Brown. ISBN 978-0-316-15414-7.
- ↑ Boehm, Barry W. (mayo de 1988). "Un modelo espiral de desarrollo y mejora de software". IEEE Computer . 21 (2): 61– 72. Bibcode : 1988Compr..21e..61B . doi : 10.1109/2.59 . S2CID 1781829 .
- ↑ Noll, Paul (1977). Programación estructurada para el programador COBOL: diseño, documentación, codificación, pruebas . M. Murach & Associates.
- ↑ Schwille, Jürgen (1993). "Uso y abuso de excepciones: 12 directrices para el manejo adecuado de excepciones". Lecture Notes in Computer Science . Ada – Europe '93 (Actas). Lecture Notes in Computer Science. Vol. 688. Springer Berlin Heidelberg. pp. 142–152 . doi : 10.1007/3-540-56802-6_12 . ISBN 978-3-540-56802-5.
- ↑ 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.
- ↑ MTSBS (marzo-abril de 1981). "BÁSICamente hablando... ¡bytes de FORTRAN!". The Michigan Technic . 99 (4).
{{cite journal}}: CS1 maint: nombres múltiples: lista de autores ( enlace ) CS1 maint: nombres numéricos: lista de autores ( enlace ) - ↑ Hamming, Richard (1996). El arte de hacer ciencia e ingeniería . Taylor & Francis. ISBN 9056995006.
- ↑ Foote, Brian; Yoder, Joseph (26 de junio de 1999). "Gran bola de lodo" . laputan.org . Consultado el 14 de abril de 2019 .
- ↑ Tomov, Latchezar; Ivanova, Valentina (octubre de 2014). " Enseñanza de buenas prácticas en ingeniería de software mediante contraejemplos" . Ciencias de la Computación y Educación en Ciencias de la Computación (1): 397–405 . Recuperado el 5 de marzo de 2018 .
- ↑ De Troyer, O. (13 de mayo de 1991). Andersen, Rudolf; Bubenko, Janis A.; Sølvberg, Arne (eds.). El modelo de relación binaria OO : un modelo conceptual verdaderamente orientado a objetos (PDF) . Ingeniería avanzada de sistemas de información. Notas sobre mecánica de fluidos numérica y diseño multidisciplinario. Vol. 498. págs. 561–578 . doi : 10.1007/3-540-54059-8_104 . ISBN 978-3-319-98176-5. S2CID 10894568 .
Enlaces externos
- Ir a la declaración considerada dañina . El clásico rechazo al código espagueti por Edsger Dijkstra.
- No sabemos adónde ir si no sabemos de dónde venimos, por R. Lawrence Clark, de DATAMATION, diciembre de 1973. Archivado el 16 de julio de 2018 en Wayback Machine.
- Refactorización de código Java espagueti en código Java bento, separando un tazón lleno de código de una clase en siete clases.
- Objetos y marcos de trabajo: una mirada retrospectiva, por Brian Rinaldi
- Programación de pasta: código para espaguetis, lasaña, ravioles y macarrones archivado el 21/01/2023 en Wayback Machine.
- Teoría de la pasta en la programación
- Antipatrones
- Folclore de la ingeniería de software
- Términos peyorativos relacionados con la tecnología
- Metáforas que hacen referencia a los espaguetis