Programmation spaghetti
Exemple de flux de contrôle spaghetti
L'instruction goto
, ou ses équivalents, est souvent responsable de la production de code spaghetti. Elle est d'ailleurs dépréciée dans les langages modernes pour cette raison. Elle est souvent utilisée dans les langages comme le BASIC ou l'assembleur (dans ce dernier cas, les branchements inconditionnels sont cependant inévitables). L'exemple suivant, qui affiche la liste des entiers compris entre 1 et 10 ainsi que leur carré, est un exemple de code spaghetti 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
Le même résultat est obtenu par le programme suivant, plus respectueux des principes de la programmation structurée :
10 FOR i = 1 TO 10
20 PRINT i & " au carré = " & i * i
30 NEXT i
40 PRINT "Programme terminé."
50 END
L'exemple suivant, en Fortran 77, calcule le nombre de solutions du problème des huit dames généralisé à un damier n×n. La forte imbrication des sauts (goto
) rend le programme particulièrement difficile à suivre. L'algorithme consiste en un backtracking récursif. Les configurations possibles des dames sont considérées comme des matrices de permutations, et le programme parcourt toutes les permutations en éliminant les « branches » impossibles, qui sont détectées lorsqu'on trouve deux dames sur une même diagonale. La récursivité, qui n'existe pas en Fortran 77, est elle-même implémentée à l'aide de tableaux et de l'instruction 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
Exemple de flux de données spaghetti
10 in:INTEGER
20 out:INTEGER
30
40 PROCEDURE Square
50 out = in * in
60 END PROCEDURE
Le même résultat est obtenu par le programme suivant, plus respectueux des principes de la programmation structurée :
10 FUNCTION Square( in:INTEGER ):INTEGER
20 Square = in * in
30 END FUNCTION