INFO-H-100 : Règles de bonne pratique

Ces règles ont été déterminées dans un but pédagogique et/ou de bonne partique générale en programmation.

Structure

  • Utiliser une découpe intelligente en fonctions. Chaque fonction doit réaliser une tâche clairement identifiée.
  • Ne pas faire de fonctions de plus de 25 lignes sauf dans des cas exceptionnels à justifier.
  • Eviter la redondance dans votre code (copier coller). Si cela arrive, c'est qu'il manque soit une fonction, soit une boucle, soit que des tests conditionnels peuvent être regroupés.
  • Ne pas utiliser de variable globale.
  • Déclarer les variables en début de bloc.
  • Utiliser adéquatement des constantes globales (par exemple, la taille des tableaux sera généralement une constante globale).
  • Veiller à ce que tous les paramètres et variables d'une fonction soient utilisés dans cette fonction.
  • Les fonctions qui prennent des paramètres par référence doivent avoir le type de retour void sauf dans les cas particuliers où :
    • on veut retourner un code d'erreur entier ou
    • on veut retourner un booléen pour dire que l'opération s'est bien ou mal passée.

Contrôle de flux

  • Ne pas utiliser l'instruction goto.
  • Ne pas utiliser l'instruction continue.
  • Ne pas utiliser l'instruction break sauf dans les switch case.
  • Ne faire qu'un et un seul return par fonction (sauf celles de type void) à la dernière ligne de cette fonction.

Style

  • Ne pas utiliser le type int pour les booléens. Par exemple, les formes
    bool ok = 0;

    ou

    int ok = 1;
    while(ok==1)
    {
       <instruction>
    }

    sont à proscrire.

  • Ne pas utiliser explicitement de pointeurs.
  • Utiliser la forme raccourcie
    if(isLeapYear(2008))

    plutôt que la forme équivalente

    if(isLeapYear(2008)==true)
  • Utiliser la forme
    return <expression booléenne>

    plutôt que la forme équivalente

    bool res;
    if(<expression booléenne>)
    {
      res = true;
    }
    else
    {
      res = false;
    }
    return res;
  • Ne pas exécuter plusieurs fois une fonction alors qu'une exécution suffit. Par exemple, ne pas faire
    for(int currentDay=0; currentDay<daysInMonth(12); currentDay++)

    mais plutôt

    int daysInDecember = daysInMonth(12);
    for(int currentDay=0; currentDay<daysInDecember; currentDay++)

    Ici, la fonction daysInMonth(12) renverra toujours la même valeur. Mettre l'appel avant la boucle signifie :

    • que le contenu de la variable daysInDecember ne changera pas durant l'exécution de cette fonction
    • deuxièmement, cette fonction sera appelée une et une seule fois et non à chaque tour de boucle.

Gestion des erreurs

  • Gérer les erreurs au niveau du programme : toutes les entrées des utilisateurs doivent être vérifiées et traitées le cas échéant.
  • Au niveau des fonctions : soit gérer les erreurs, soit documenter le domaine des paramètres. Dans ce dernier cas, si une valeur donnée par paramètre n'est pas dans le domaine, le comportement de la fonction est indéterminé. Exemple :
    int daysInMonth(int month, int year)
    {
       int nbDays = 31;
       if(month==4 or month==6 or month==9 or month==11)
          nbDays = 30;
       else if(month==2)
          if(isLeapYear(year))
             nbDays = 29;
          else
             nbDays = 28;
       return nbDays;
    }

    Cette fonction attend un month entre 1 et 12. Le résultat pour les nombres inférieurs à 1 et supérieurs à 12 n'a pas de sens.

  • La fonction int main() doit retourner un entier. En général, cette fonction renvoie 0 pour signifier que le traitement s'est effectué correctement.
 
teaching/infoh100/bonne_pratique.txt · Last modified: 2011/04/09 16:39 by boverhae