---
title: "Code spaghetti"
type: "antipattern"
slug: "spaghetti-code"
url: "http://localhost:3000/fr/antipatterns/spaghetti-code.md"
description: "Code source logiciel à la structure déficiente"
---
# Code spaghetti

> Code source logiciel à la structure déficiente

Le **code spaghetti** est du [code source](https://en.wikipedia.org/wiki/Source%5Fcode "Source code") [informatique](https://en.wikipedia.org/wiki/Computer "Computer") qui encode un [flot de contrôle](https://en.wikipedia.org/wiki/Control%5Fflow "Control flow") alambiqué et, par conséquent, difficile à comprendre. Les instructions de contrôle dirigent l'[exécution](https://en.wikipedia.org/wiki/Execution%5F%28computing%29 "Execution (computing)") du [programme](https://en.wikipedia.org/wiki/Computer%5Fprogram "Computer program") d'une manière qui, au lieu de présenter une structure de qualité, ressemble à des [spaghettis](https://en.wikipedia.org/wiki/Spaghetti "Spaghetti") cuits, entremêlés et emmêlés. Ce code a tendance à être difficile à [maintenir](https://en.wikipedia.org/wiki/Software%5Fmaintenance "Software maintenance").

Étant donné que la logique de flot de contrôle encodée au moyen de l'instruction [goto](https://en.wikipedia.org/wiki/Goto "Goto") a tendance à produire un flot de contrôle alambiqué, l'usage de goto est souvent associé à une qualification de code spaghetti. La pratique de la [programmation structurée](https://en.wikipedia.org/wiki/Structured%5Fprogramming "Structured programming") a été conçue pour éliminer le besoin et l'usage de l'instruction goto, comme l'un des moyens d'éviter la production de code spaghetti. Garantir la création d'un [logiciel](https://en.wikipedia.org/wiki/Software "Software") de haute qualité, plutôt que de code spaghetti, fait souvent intervenir des aspects tels que l'utilisation de meilleurs [outils](https://en.wikipedia.org/wiki/Software%5Ftool "Software tool"), la [formation](https://en.wikipedia.org/wiki/Training "Training") des développeurs et l'amélioration des [processus de développement logiciel](https://en.wikipedia.org/wiki/Software%5Fdevelopment%5Fprocess "Software development process").

Le code spaghetti peut aussi désigner un [anti-pattern](https://en.wikipedia.org/wiki/Anti-pattern "Anti-pattern") dans lequel du [code orienté objet](https://en.wikipedia.org/wiki/Object-oriented%5Fprogramming "Object-oriented programming") est écrit dans un style procédural, par exemple en créant des classes dont les méthodes sont excessivement longues et désordonnées, ou en renonçant aux concepts orientés objet tels que le [polymorphisme](https://en.wikipedia.org/wiki/Polymorphism%5F%28computer%5Fscience%29 "Polymorphism (computer science)"). La présence de cette forme de code spaghetti peut réduire considérablement la compréhensibilité d'un système.

## Histoire

On ne sait pas exactement quand l'expression _code spaghetti_ a été forgée. Martin Hopkins y a fait une référence précoce dans ce contexte en 1972, écrivant que la « principale motivation derrière l'élimination de l'instruction goto est l'espoir que les programmes résultants ne ressembleront pas à un bol de spaghettis ». Dans l'ouvrage de 1978 _A primer on disciplined programming using PL/I, PL/CS, and PL/CT_, [Richard Conway](https://en.wikipedia.org/wiki/Richard%5FW.%5FConway "Richard W. Conway") décrivait des programmes ayant « la même structure logique soignée qu'une assiette de spaghettis », une formule reprise dans l'ouvrage de 1979 _An Introduction to Programming_ qu'il a coécrit avec [David Gries](https://en.wikipedia.org/wiki/David%5FGries "David Gries"). Dans l'article de 1988 _A spiral model of software development and enhancement_, le terme est employé pour décrire l'ancienne pratique du _modèle « code and fix »_, qui manquait de planification et a finalement conduit au développement du [modèle en cascade](https://en.wikipedia.org/wiki/Waterfall%5Fmodel "Waterfall model"). Dans l'ouvrage de 1979 _Structured programming for the COBOL programmer_, l'auteur Paul Noll utilise les expressions _code spaghetti_ et _rat's nest_ (« nid de rats ») comme synonymes pour décrire un code source mal structuré.

Lors de la conférence _Ada – Europe '93_, [Ada](https://en.wikipedia.org/wiki/Ada%5F%28programming%5Flanguage%29 "Ada (programming language)") a été décrit comme forçant le programmeur à « produire du code compréhensible, plutôt que du code spaghetti », en raison de son mécanisme restrictif de propagation des exceptions.

Dans une publication de 1980 du [Bureau national des normes des États-Unis](https://en.wikipedia.org/wiki/National%5FInstitute%5Fof%5FStandards%5Fand%5FTechnology "National Institute of Standards and Technology"), l'expression _programme spaghetti_ a été utilisée pour décrire d'anciens programmes ayant des « fichiers fragmentés et dispersés ».

Dans une parodie sur les langages informatiques publiée en 1981 dans _The Michigan Technic_, intitulée « BASICally speaking...FORTRAN bytes!! », l'auteur décrivait [FORTRAN](https://en.wikipedia.org/wiki/FORTRAN "FORTRAN") en affirmant qu'« il est entièrement constitué de code spaghetti ».

[Richard Hamming](https://en.wikipedia.org/wiki/Richard%5FHamming "Richard Hamming") a décrit dans ses cours l'étymologie du terme dans le contexte de la programmation des débuts en codes binaires :

> Si, en corrigeant une erreur, vous vouliez insérer des instructions omises, vous preniez l'instruction immédiatement précédente et vous la remplaciez par un saut vers un espace vide. Là, vous placiez l'instruction que vous veniez d'écraser, vous ajoutiez les instructions que vous vouliez insérer, puis vous faisiez suivre d'un saut de retour vers le programme principal. Ainsi, le programme devenait rapidement une suite de sauts du contrôle vers des endroits étranges. Lorsque, comme c'est presque toujours le cas, il y avait des erreurs dans les corrections, vous utilisiez alors de nouveau la même astuce, en vous servant d'un autre espace disponible. En conséquence, _le chemin de contrôle du programme à travers la mémoire prenait bientôt l'apparence d'une boîte de spaghettis._ Pourquoi ne pas simplement les insérer dans le fil des instructions ? Parce qu'il aurait alors fallu reprendre tout le programme et modifier toutes les adresses qui renvoyaient à l'une des instructions déplacées ! Tout sauf ça !

## Exemples

### Simple

Le code [BASIC](https://en.wikipedia.org/wiki/BASIC "BASIC") suivant, un programme qui affiche les nombres de 1 à 100, est un exemple relativement simple de code que l'on peut comprendre plus facilement avec un flot de contrôle structuré plutôt qu'en utilisant goto. L'utilisation de `GOTO` pour les boucles et l'absence d'indentation rendent le déroulement logique peu clair.

1 i=0
2 i=i+1
3 PRINT i
4 IF i>=100 THEN GOTO 6
5 GOTO 2
6 END

Le code suivant produit le même résultat, mais utilise une [instruction de boucle](https://en.wikipedia.org/wiki/Loop%5F%28computing%29 "Loop (computing)") structurée et l'indentation pour améliorer la lisibilité.

1 FOR i=1 TO 100
2     PRINT i
3 NEXT i
4 END

### Plus représentatif

Le code suivant implémente un [algorithme de tri](https://en.wikipedia.org/wiki/Sorting%5Falgorithm "Sorting algorithm") numérique. L'utilisation d'instructions goto donne au flot de contrôle un caractère de type spaghetti.

  INPUT "How many numbers should be sorted? "; T
  DIM n(T)
  FOR i = 1 TO T
    PRINT "NUMBER:"; i
    INPUT n(i)
  NEXT i
  'Calculs :
  C = T
E180:
  C = INT(C / 2)
  IF C = 0 THEN GOTO C330
  D = T - C
  E = 1
I220:
  f = E
F230:
  g = f + C
  IF n(f) > n(g) THEN SWAP n(f), n(g)
  f = f - C
  IF f > 0 THEN GOTO F230
  E = E + 1
  IF E > D THEN GOTO E180
  GOTO I220
C330:
  PRINT "The sorted list is"
  FOR i = 1 TO T
    PRINT n(i)
  NEXT i

## Concepts liés

### Grande boule de boue

Une grande boule de boue (« big ball of mud ») est un [système logiciel](https://en.wikipedia.org/wiki/Software%5Fsystem "Software system") dépourvu d'architecture perceptible. Bien qu'indésirables du point de vue du génie logiciel, de tels systèmes sont fréquents en pratique en raison des pressions commerciales, du [renouvellement](https://en.wikipedia.org/wiki/Turnover%5F%28employment%29 "Turnover (employment)") des développeurs et de l'[entropie logicielle](https://en.wikipedia.org/wiki/Software%5Fentropy "Software entropy"). Le terme a été popularisé par Brian Foote et Joseph Yoder, bien qu'ils en attribuent la paternité à Brian Marick.

> Une Big Ball of Mud est une jungle de code spaghetti structurée au hasard, tentaculaire, négligée, rafistolée au ruban adhésif et au fil de fer. Ces systèmes présentent des signes indéniables de croissance non régulée et de réparations répétées et expéditives. L'information y est partagée sans retenue entre des éléments éloignés du système, souvent au point que presque toute l'information importante devient globale ou dupliquée.
>
> La structure d'ensemble du système n'a peut-être jamais été bien définie.
>
> Et si elle l'a été, elle s'est peut-être érodée au point d'être méconnaissable. Les programmeurs ayant la moindre sensibilité architecturale fuient ces bourbiers. Seuls ceux qui se désintéressent de l'architecture et qui, peut-être, s'accommodent de l'inertie de la corvée quotidienne consistant à colmater les trous de ces digues qui cèdent, se contentent de travailler sur de tels systèmes.

— Brian Foote et Joseph Yoder, _Big Ball of Mud._ Quatrième conférence sur les langages de patrons de programmes (PLoP '97/EuroPLoP '97), Monticello, Illinois, septembre 1997

### Termes liés aux pâtes

Inspirés par la popularité du _code spaghetti_, d'autres termes inspirés des [pâtes](https://en.wikipedia.org/wiki/Pasta "Pasta") et décrivant la nature structurelle du code incluent :

Code lasagne

Le code [lasagne](https://en.wikipedia.org/wiki/Lasagna "Lasagna") comporte des [couches](https://en.wikipedia.org/wiki/Architectural%5Flayer "Architectural layer") si imbriquées que modifier une couche oblige à modifier aussi les autres.

Code ravioli

Le code [ravioli](https://en.wikipedia.org/wiki/Ravioli "Ravioli") est composé de [classes](https://en.wikipedia.org/wiki/Class%5F%28programming%29 "Class (programming)") bien structurées, faciles à comprendre isolément, mais qui, combinées, aboutissent à une conception du système peu claire.
