Code spaghetti - Spaghetti code

Le code spaghetti est une expression péjorative pour le code source non structuré et difficile à maintenir . Le code spaghetti peut être causé par plusieurs facteurs, tels que des exigences de projet volatiles , un manque de règles de style de programmation et des ingénieurs logiciels avec une capacité ou une expérience insuffisante.

Sens

Le code qui abuse des instructions GOTO plutôt que des constructions de programmation structurées , ce qui entraîne des programmes alambiqués et impossibles à maintenir, est souvent appelé code spaghetti. Un tel code a une structure de contrôle complexe et enchevêtrée , résultant en un flux de programme qui est conceptuellement comme un bol de spaghettis , tordu et enchevêtré. Dans une publication de 1980 du National Bureau of Standards des États-Unis , l'expression programme spaghetti a été utilisée pour décrire des programmes plus anciens ayant des « fichiers fragmentés et dispersés ». Le code spaghetti peut également décrire un anti-modèle dans lequel le code orienté objet est écrit dans un style procédural, par exemple en créant des classes dont les méthodes sont trop longues et désordonnées, ou en abandonnant les concepts orientés objet comme le polymorphisme . La présence de cette forme de code spaghetti peut réduire considérablement la compréhensibilité d'un système.

Histoire

Il n'est pas clair quand l'expression code spaghetti est entrée dans l'usage courant; cependant, plusieurs références sont apparues en 1977 dont Macaroni is Better Than Spaghetti de Guy Steele. Dans le livre de 1978 A primer on disciplined programming using PL/I, PL/CS et PL/CT , Richard Conway a utilisé le terme pour décrire les types de programmes qui « ont la même structure logique propre qu'une assiette de spaghettis », une expression répété dans le livre de 1979 An Introduction to Programming qu'il a co-écrit avec David Gries . Dans l'article de 1988 Un modèle en spirale de développement et d'amélioration de logiciels , le terme est utilisé pour décrire l'ancienne pratique du modèle de code et de correction , qui manquait de planification et a finalement conduit au développement du modèle en cascade . Dans le livre de 1979 Programmation structurée pour le programmeur COBOL , l'auteur Paul Noll utilise les expressions code spaghetti et nid de rat comme synonymes pour décrire un code source mal structuré.

Lors de la conférence Ada - Europe '93 , Ada a été décrite comme forçant le programmeur à « produire du code compréhensible, au lieu du code spaghetti », en raison de son mécanisme de propagation d'exception restrictif.

Dans une parodie de langages informatiques de 1981 dans The Michigan Technic intitulée " BASICally Speaking... FORTRAN bytes !! ", l'auteur a décrit le FORTRAN en déclarant que " il se compose entièrement de code spaghetti ".

Richard Hamming a décrit dans ses conférences l'étymologie du terme dans le contexte de la programmation précoce en codes binaires :

Si, en corrigeant une erreur, vous vouliez insérer des instructions omises, vous avez pris l'instruction immédiatement précédente et l'avez remplacée par un transfert dans un espace vide. Là, vous avez inséré l'instruction que vous venez d'écrire, ajouté les instructions que vous vouliez insérer, puis suivie d'un transfert vers le programme principal. Ainsi, le programme devint bientôt une séquence de sauts du contrôle vers des endroits étranges. Lorsque, comme cela arrive presque toujours, il y avait des erreurs dans les corrections, vous avez ensuite utilisé à nouveau la même astuce, en utilisant un autre espace disponible. En conséquence, le chemin de contrôle du programme à travers le stockage a rapidement pris l'apparence d'une boîte de spaghetti. Pourquoi ne pas simplement les insérer dans la séquence d'instructions ? Parce qu'alors il faudrait revoir tout le programme et changer toutes les adresses qui font référence à l'une des instructions déplacées ! Tout sauf ça !

Expressions associées

Code raviolis

Le code Ravioli est un terme spécifique à la programmation orientée objet . Il décrit un code qui comprend des classes bien structurées qui sont faciles à comprendre isolément, mais difficiles à comprendre dans leur ensemble.

Code lasagne

Le code de lasagne fait référence au code dont les couches sont si compliquées et entrelacées que la modification d'une couche nécessiterait des modifications dans toutes les autres couches.

Exemples

Voici ce qui serait considéré comme un exemple trivial de code spaghetti en BASIC . Le programme imprime chacun des nombres 1 à 100 à l'écran avec son carré. L'indentation n'est pas utilisée pour différencier les différentes actions effectuées par le code, et les GOTOinstructions du programme créent une dépendance aux numéros de ligne . Le flux d'exécution d'un domaine à un autre est plus difficile à prévoir. Les occurrences réelles de code spaghetti sont plus complexes et peuvent augmenter considérablement les coûts de maintenance d'un programme.

1 i=0;

2 i=i+1;

3 PRINT i; "squared=";i*i;

4 IF i>=100 THEN GOTO 6;

5 GOTO 2;

6 PRINT "Program Completed.";

7 END

Voici le même code écrit dans un style de programmation structuré :

1 FOR i=1 TO 100
2     PRINT i;"squared=";i*i
3 NEXT i
4 PRINT "Program Completed."
5 END

Le programme saute d'une zone à l'autre, mais ce saut est formel et plus facilement prévisible, car les boucles et les fonctions for fournissent un contrôle de flux tandis que l' instruction goto encourage un contrôle de flux arbitraire. Bien que cet exemple soit petit, les programmes du monde réel sont composés de nombreuses lignes de code et sont difficiles à maintenir lorsqu'ils sont écrits en code spaghetti.

Voici un autre exemple de code Spaghetti avec des instructions GOTO intégrées.

  INPUT "How many numbers should be sorted? "; T
  DIM n(T)
  FOR i = 1 TO T
    PRINT "NUMBER:"; i
    INPUT n(i)
  NEXT i
  'Calculations:
  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

Voir également

Les références

Liens externes