Programare spaghete

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

Exemplu de control al fluxului de spaghete

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 20

Acelaș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 END

Exemplul 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 END

Exemplu de flux de date spaghete

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

Acelaș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

Vezi și tu

Note și referințe

  1. (în) Cercetare și strategie în materie de siguranță, „  Accelerarea neintenționată Toyota și Big Bowl of Code„ Spaghetti  ” pe https://www.usna.edu ,11 aprilie 2016(accesat la 5 februarie 2021 )
  2. Zarmakuizz, „  Un alt exemplu de cod spaghetti: Toyota  ” , la https://linuxfr.org ,6 martie 2014(accesat la 5 februarie 2021 )
  3. „Programare algoritmică” , philippebeaubien.com.