Programación de espaguetis

En programación informática , el código spaghetti es un estilo de escritura del código fuente que favorece la aparición del síndrome spaghetti  : un código poco claro y uso excesivo de saltos incondicionales (ver goto ) , con excepciones todos los sentidos, manejando eventos complejos y diversos hilos . Este estilo de escritura de código debería prohibirse porque puede causar serios problemas, por ejemplo, el caso de Toyota en 2013.

De hecho, la programación espagueti califica cualquier cosa que no determine el quién, qué y cómo de una toma de control por parte de un programa (malinterpretando el flujo de control). Por lo tanto, el código tarda más en actualizarse porque requiere volver a revisar las referencias.

Esta noción también se aplica al nivel de flujo de datos, es decir, a todo aquello que no permita determinar el quién, qué y cómo de una modificación de datos. Esta situación se debe al uso excesivo de un acoplamiento fuerte .

La programación de espaguetis es un ejemplo de anti-jefe .

Ejemplo de flujo de control de espaguetis

La instrucción goto, o sus equivalentes, a menudo es responsable de producir código espagueti. También está en desuso en los lenguajes modernos por este motivo. Se usa a menudo en lenguajes como BASIC o ensamblador (en este último caso, la ramificación incondicional es inevitable). El siguiente ejemplo, que muestra la lista de números enteros entre 1 y 10, así como sus cuadrados, es un ejemplo de código espagueti en BASIC:

10 i = 0 20 i = i + 1 30 IF i <> 11 THEN GOTO 80 40 IF i = 11 THEN GOTO 60 50 GOTO 20 60 PRINT "Programme terminé." 70 END 80 PRINT i & " au carré = " & i * i 90 GOTO 20

El mismo resultado se obtiene con el siguiente programa, más respetuoso con los principios de la programación estructurada  :

10 FOR i = 1 TO 10 20 PRINT i & " au carré = " & i * i 30 NEXT i 40 PRINT "Programme terminé." 50 END

El siguiente ejemplo, en Fortran 77 , calcula el número de soluciones del problema de las ocho fichas generalizadas a un tablero de ajedrez de n × n . El fuerte agrupamiento de saltos ( goto) hace que el programa sea particularmente difícil de seguir. El algoritmo consiste en un retroceso recursivo. Las posibles configuraciones de las fichas se consideran matrices de permutaciones , y el programa pasa por todas las permutaciones eliminando las "ramas" imposibles, que se detectan cuando se encuentran dos fichas en la misma diagonal. La recursividad, que no existe en Fortran 77, se implementa en sí misma mediante matrices y la instrucción goto.

PROGRAM DAMES IMPLICIT INTEGER(A-Z) PARAMETER(L=14) DIMENSION A(L),S(L),U(4*L-2) DO 10 I=1,L A(I)=I 10 CONTINUE DO 20 I=1,4*L-2 U(I)=0 20 CONTINUE DO 110 N=1,L M=0 I=1 R=2*N-1 GO TO 40 30 S(I)=J U(P)=1 U(Q+R)=1 I=I+1 40 IF(I.GT.N) GO TO 80 J=I 50 Z=A(I) Y=A(J) P=I-Y+N Q=I+Y-1 A(I)=Y A(J)=Z IF((U(P).EQ.0).AND.(U(Q+R).EQ.0)) GO TO 30 60 J=J+1 IF(J.LE.N) GO TO 50 70 J=J-1 IF(J.EQ.I) GO TO 90 Z=A(I) A(I)=A(J) A(J)=Z GO TO 70 80 M=M+1 90 I=I-1 IF(I.EQ.0) GO TO 100 P=I-A(I)+N Q=I+A(I)-1 J=S(I) U(P)=0 U(Q+R)=0 GO TO 60 100 PRINT *,N,M 110 CONTINUE END

Ejemplo de flujo de datos de espaguetis

10 in:INTEGER 20 out:INTEGER 30 40 PROCEDURE Square 50 out = in * in 60 END PROCEDURE

El mismo resultado se obtiene con el siguiente programa, más respetuoso con los principios de la programación estructurada  :

10 FUNCTION Square( in:INTEGER ):INTEGER 20 Square = in * in 30 END FUNCTION

Ver también

Notas y referencias

  1. (in) Safety Research & Strategy, "  Toyota Unintended Acceleration and the Big Bowl of" Spaghetti "Code  " en https://www.usna.edu ,11 de abril de 2016(consultado el 5 de febrero de 2021 )
  2. Zarmakuizz, "  Otro ejemplo de código espagueti: Toyota  " , en https://linuxfr.org ,6 de marzo de 2014(consultado el 5 de febrero de 2021 )
  3. "Programación de algoritmos" , philippebeaubien.com.