Programmation spaghetti

Un article de Wikipédia, l'encyclopédie libre.

En programmation informatique, la programmation spaghetti est un style d'écriture de code source qui favorise l'apparition du syndrome du plat de spaghettis : un code peu clair et qui fait un usage excessif de sauts inconditionnels (voir goto), d'exceptions en tous sens, de gestion des événements complexes et de threads divers. Ce style d'écriture de code est à bannir car il peut engendrer des problèmes graves, comme le montre par exemple le procès de l'affaire Toyota en 2013[1],[2].

En fait, la programmation spaghetti qualifie tout ce qui ne permet pas de déterminer le qui, le quoi et le comment d'une prise de contrôle par une portion de programme (incompréhension du flux de contrôle). Le code est donc plus long à mettre à jour car cela nécessite de remonter le fil des renvois[3].

Cette notion s'applique aussi au niveau du flux de données, c'est-à-dire à tout ce qui ne permet pas de déterminer le qui, le quoi et le comment d’une modification de données. Cette situation est causée par un usage excessif de couplage fort.

La programmation spaghetti est un exemple d'anti-patron.

Exemple de flux de contrôle spaghetti[modifier | modifier le code]

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[modifier | modifier le code]

 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

Voir aussi[modifier | modifier le code]

Notes et références[modifier | modifier le code]

  1. (en) Safety Research & Strategie, « Toyota Unintended Acceleration and the Big Bowl of “Spaghetti”Code », sur usna.edu, (consulté le ).
  2. Zarmakuizz, « Encore un exemple de code spaghetti : Toyota », sur linuxfr.org, (consulté le ).
  3. « Programmation par algorithme », philippebeaubien.com.