În programarea computerizată , codul spaghetti este un stil de scriere a codului sursă care favorizează apariția sindromului spaghetti : un cod neclar și o utilizare excesivă a salturilor necondiționate (vezi goto ) , cu excepții toate simțurile, gestionarea evenimentelor complexe și a diferitelor fire . Acest stil de scriere a codului ar trebui interzis deoarece poate provoca probleme grave, de exemplu cazul Toyota din 2013.
De fapt, programarea spaghetelor califică orice lucru care nu poate determina cine, ce și cum o preluare de către o porțiune a unui program (neînțelegând fluxul de control). Prin urmare, codul durează mai mult pentru actualizare, deoarece necesită revenirea înapoi a referințelor.
Această noțiune se aplică și la nivelul fluxului de date, adică la orice lucru care nu face posibilă determinarea cine, ce și cum a unei modificări de date. Această situație este cauzată de utilizarea excesivă a cuplajului puternic .
Programarea spaghetelor este un exemplu de anti-șef .
Instrucțiunea gotosau echivalentele sale sunt deseori responsabile pentru producerea codului spaghetti. De asemenea, este depreciat în limbile moderne din acest motiv. Este adesea folosit în limbi precum BASIC sau asamblare (în acest din urmă caz, ramificarea necondiționată este inevitabilă). Următorul exemplu, care afișează lista numerelor între 1 și 10, precum și pătratele lor, este un exemplu de cod spaghetti în 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 20Același rezultat este obținut de următorul program, mai respectuos cu principiile programării structurate :
10 FOR i = 1 TO 10 20 PRINT i & " au carré = " & i * i 30 NEXT i 40 PRINT "Programme terminé." 50 ENDExemplul următor, în Fortran 77 , calculează numărul de soluții ale problemei opt dame generalizate la un n x n tablă de șah . Cuibărirea puternică a salturilor ( goto) face programul deosebit de dificil de urmat. Algoritmul constă în retracedare recursivă. Configurațiile posibile ale verificatorilor sunt considerate ca matrici de permutații , iar programul trece prin toate permutările eliminând „ramurile” imposibile, care sunt detectate atunci când se găsesc două verificatoare pe aceeași diagonală. Recursivitatea, care nu există în Fortran 77, este ea însăși implementată folosind tablouri și instrucțiuni 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 ENDAcelași rezultat este obținut de următorul program, mai respectuos cu principiile programării structurate :
10 FUNCTION Square( in:INTEGER ):INTEGER 20 Square = in * in 30 END FUNCTION