Código espagueti - Spaghetti code

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.

Sentido

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. 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. En una publicación de 1980 de la Oficina Nacional de Normas de los Estados Unidos , la frase programa de espaguetis se utilizó para describir programas más antiguos que tenían "archivos fragmentados y dispersos". El código espagueti también puede describir un anti-patró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 . 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 se volvió de uso común; sin embargo, varias referencias aparecieron en 1977 incluyendo Macaroni is Better Than Spaghetti de Guy Steele. 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 espaguetis", una frase repetido en el libro de 1979 Una introducción a la programación que fue coautor con David Gries . 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 código y el modelo de corrección , que carecía de planificación y finalmente condujo al desarrollo del modelo en 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 para describir el código fuente mal estructurado.

En la conferencia Ada - Europe '93 , se describió que Ada obligaba al programador a "producir código comprensible, en lugar de espagueti", debido a su mecanismo de propagación de excepciones restrictivas.

En una parodia de lenguajes de computadora de 1981 en The Michigan Technic titulada "Básicamente hablando ... ¡FORTRAN bytes!", El autor describió a FORTRAN afirmando que "consiste enteramente en código espagueti".

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, 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.

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.

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 GOTOdeclaraciones 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 PRINT i; "squared=";i*i;

4 IF i>=100 THEN GOTO 6;

5 GOTO 2;

6 PRINT "Program Completed.";

7 END

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

1 FOR i=1 TO 100
2     PRINT i;"squared=";i*i
3 NEXT i
4 PRINT "Program Completed."
5 END

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 "How many numbers should be sorted? "; T
  DIM n(T)
  FOR i = 1 TO T
    PRINT "NUMBER:"; i
    INPUT n(i)
  NEXT i
  'Calculations:
  C = T
 E180:
  C = INT(C / 2)
  IF C = 0 THEN GOTO C330
  D = T - C
  E = 1
 I220:
  f = E
 F230:
  g = f + C
  IF n(f) > n(g) THEN SWAP n(f), n(g)
  f = f - C
  IF f > 0 THEN GOTO F230
  E = E + 1
  IF E > D THEN GOTO E180
 GOTO I220
 C330:
  PRINT "The sorted list is"
  FOR i = 1 TO T
    PRINT n(i)
  NEXT i

Ver también

Referencias

enlaces externos