stringtranslate.com

Código espagueti

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]

Significado

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]

Historia

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!

Frases relacionadas

Código de raviolis

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]

Código de lasaña

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]

Ejemplos

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 GOTOinstrucciones 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                                                                                               

Véase también

Referencias

  1. ^ Markus, Pizka (2004). "¿Cómo enderezar el código espagueti con refactorización?" (PDF) . Software Engineering Research and Practice : 846–852. Archivado desde el original (PDF) el 5 de marzo de 2018. Consultado el 5 de marzo de 2018 .
  2. ^ 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 sobre lingüística, filología y fonética . 10 : 187–210. Archivado desde el original (PDF) el 6 de marzo de 2018. Consultado el 5 de marzo de 2018 .
  3. ^ Horstmann, Cay (2008). "Capítulo 6 - Iteración". Conceptos de Java para AP Computer Science (quinta edición [es decir, segunda edición]. ed.). Hoboken, NJ: J. Wiley & Sons. págs. 235–236. ISBN 978-0-470-18160-7. Recuperado el 2 de enero de 2017 .
  4. ^ Oficina Nacional de Normas de los Estados Unidos (1980). Publicación técnica especial de ASTM . Imprenta del Gobierno de los Estados Unidos.
  5. ^ 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. CiteSeerX 10.1.1.156.1524 . doi :10.1109/TSE.2009.50. ISSN  0098-5589. S2CID  14767901. 
  6. ^ Abbes, M.; Khomh, F.; Gueheneuc, YG; Antoniol, G. (2011). "Un estudio empírico del impacto de dos antipatrones, código blob y código espagueti, en la comprensión de programas". 2011 15th European Conference on Software Maintenance and Reengineering . págs. 181–190. CiteSeerX 10.1.1.294.1685 . doi :10.1109/CSMR.2011.24. ISBN  978-1-61284-259-2.S2CID14152638  .​
  7. ^ 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
  8. ^ 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.
  9. ^ Conway, Richard; Gries, David (1979). Introducción a la programación (3.ª ed.). Little, Brown. ISBN 978-0-316-15414-7.
  10. ^ Boehm, Barry W. (mayo de 1988). "Un modelo espiral de desarrollo y mejora de software". IEEE Computer . 21 (2): 61–72. doi :10.1109/2.59. S2CID  1781829.
  11. ^ Noll, Paul (1977). Programación estructurada para el programador COBOL: diseño, documentación, codificación, pruebas . M. Murach & Associates.
  12. ^ Schwille, Jürgen (1993). "Uso y abuso de excepciones: 12 pautas para el manejo adecuado de excepciones". Apuntes de clase en informática . Ada – Europe '93 (Actas). Apuntes de clase en informática. Vol. 688. Springer Berlin Heidelberg. págs. 142–152. doi :10.1007/3-540-56802-6_12. ISBN 978-3-540-56802-5.
  13. ^ MTSBS [ aclaración necesaria ] (marzo-abril de 1981). "Básicamente hablando... ¡bytes 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 )
  14. ^ Hamming, Richard (1996). El arte de hacer ciencia e ingeniería . Taylor & Francis. ISBN 9056995006.
  15. ^ De Troyer, O. (13 de mayo de 1991). Andersen, Rudolf; Bubenko, Janis A.; Sølvberg, Arne (eds.). El modelo de relación OO-binario: Un modelo conceptual verdaderamente orientado a objetos (PDF) . Ingeniería de sistemas de información avanzada. Notas sobre mecánica numérica de fluidos y diseño multidisciplinario. Vol. 498. págs. 561–578. doi :10.1007/3-540-54059-8_104. ISBN 978-3-319-98176-5.S2CID10894568  .​
  16. ^ 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 . Consultado el 5 de marzo de 2018 .

Enlaces externos