Un forum web "Bien programmer en C" permet de poser des questions sur les articles, le C en général, la programmation etc.
L'Echelle de Goret
Dernière mise à jour : 28/01/2009 11:25:18 | Home
Introduction
Qui n'a jamais lu sur un forum de programmation 'Tu codes comme un goret' ou 'c'est codé gomme un goret'?
D'abord, c'est quoi un goret ?
C'est un autre nom du porcelet, petit du cochon domestique. C'est un animal plutôt sympathique mais qui a la réputation (à mon avis injustifiée) de ne pas être très propre, probablement parce qu'il aime les bains de boue... Mais la réputation est tenace et l'expression 'comme un goret' signifie 'salement', 'de façon crade' etc.
Bref, en informatique, ça qualifie du code mal ecrit...
Afin de nuancer le propos, j'ai décidé de créer 'L'Echelle de Goret'. Elle comporte 10 niveaux appelés 'Force' (le niveau 10 étant le pire !) et permet de qualifier assez finement du code publié. Elle s'applique en priorité au code 'applicatif' ecrit en C. Il est clair que le code système est soumis à certaines contraintes qui font que ces remarques sont parfois injustifiées. D'autre part, cette echelle est bien sûr basée sur le respect des principes de la programmation structurée.
Definitions
Force 1
- Absence d'indentation
- Utilisation du type long int là ou un int suffit.
- Utilisation du type int ou long int pour les index.
- Exportation injustifiée de fonctions 'locales' (static)
-
Usage abusif de parenthèses
for (/* ... */; i < (taille.largeur)*(taille.hauteur); /* ... */)
-
Utilisation d'expressions C non idiomatiques
for (/* ... */; /* ... */; i = i + 3)
Force 2
- Absence de commentaires
- Exces de 'decorations'. Lignes, cadres...
- Définition de plus d'une variable par ligne.
- Prototype séparé pour une fonction non exportée (static).
- Utilisation du type int ou long lint pour les tailles ou nombre d'objets.
-
Utilisation de ! au lieu de == NULL dans une expression avec pointeur
FILE *fichier; ... if (!fichier) {
Force 3
- Commentaires redondants
- Commentaires en fin de ligne
- Indentation > 4 espaces
- Absence d'accolades dans les structures de code
Force 4
-
Usage du caractère TAB au lieu du caractère SPACE
do { read(file_def, &lecture, 1); switch(lecture) { case '\x68' : if (etape == 0) { etape ++; buf[i++] = lecture; printf(" %02x", lecture); } else if ((etape == 1)&&(nb_length == 2))
- Commentaires faux
- Cadres fermés à droite.
- Nombre d'indentations > 10
- Définition d'un pointeur sur chaîne sans 'const'.
-
Utilisation abusive de malloc() avec une taille fixe raisonnable.
entete = malloc (54 * sizeof *entete);
- Utilisation de goto quand une alternative simple existe.
-
Utilisation injustifiée d'élements non standard (constantes, types, fonctions).
exit (-1);
-
Utilisation abusive d'une fonction dans une boucle.
for(i = 0; i < strlen(texte) ; i++) {
Force 5
-
Ligne de plus de 80 colonnes
void ouvrir_fichier(struct taille taille, char *file, unsigned char *temp, unsigned char *entete, struct image *image)
- Commentaires longs en fin de ligne
- Usage de la 'Notation Hongroise' version Microsoft (avec les types)
- Fonction de plus d'une page visible (50 à 100 lignes selon l'éditeur)
- switch de plus de 20 case
- Utilisation du type float au lieu de double pour faire des calculs.
- Utilisation de fonctions systèmes alors qu'il existe des fonctions standards qui font le même travail.
- Utilisation abusive d'un typecast alors que le pointeur est de type void*
- Utilisation de malloc() avec un typecast
-
Utilisation de nombres magiques
fread(entete, 1, 54, fichier);
Force 6
- case de switch de plus de 10 lignes
- cacher les pointeurs
- Usage abusif du pointeur de pointeur
Force 7
- Usage du préfixe _ dans les identificateurs
- Identificateurs abscons
- Absence de prototypes
- Prototype séparé défini dans une fonction.
- Usage injustifié de variables globales privées modifiables.
-
usage de free() ou fclose() (ou équivallent) sans remettre le pointeur à NULL
fclose(fichier);
-
usage d'un break conditionnel dans un switch-case
switch(valeur) { case CAS1 : case CAS2 : if (condition) { break; } /* sinon, descend*/ case CAS3 : case CAS4 : /* action */ break; /*...*/ }
Force 8
- Inclusion de .c
- Utilisation abusive de assert().
- Plus d'un return par fonction
- Utilisation abusive de la récursion
-
Passage d'une structure en paramètre
void ouvrir_fichier(struct taille taille, /* ...*/)
- Utilisation abusive de fonctions systèmes dans du code applicatif.
Force 9
- Programmation non structurée. Abus de exit(), return, break, continue.
- Utilisation de *scanf() sans test du retour
- Utilisation de malloc() sans test du retour
- malloc() sans free()
- fopen() sans fclose()
- Usage de variables statiques modifiables dans une fonction
Force 10
- Définition de code dans un .h ([C99] Sauf inline)
- Définition de données dans un .h
- Tout le projet dans le main()
- Utilisation d'une variable non initialisée
- Utilisation de gets() ou de scanf() avec "%s"
- Utilisation abusive de goto (Code spaghetti)
- Utilisation de fopen() sans test du retour
- Usage de variables globales publiques modifiables
- Usage de l'opérateur virgule (,) dans une expression de structure de code (if, while, section 2 d'un for)
Ressources
Gruik !
© Emmanuel Delahaye 2005-2009 | emmanuel dot delahaye at gmail dot com | Haut | Home | Forum | Livre d'or