L'objectif de la programmation n'est pas seulement de faire des programmes qui marchent.
En réalité un programme n'est jamais terminé (du moins un programme conséquent tel que vous en rencontrerez en entreprise). Il faut donc pouvoir le modifiez facilement, sachant que le développeur qui sera chargé de la mise à jour de votre programme ne sera pas forcément vous même. Cela a deux conséquences:
Dans cette partie du cours, je vous donne à travers un exemple quelques conseils permettant de rendre un programme plus lisible et plus facile à modifier.
Mise à part la lisibilité et la facilité de modification, il existe d'autres critères importants en programmation que nous n'aborderons pas ici:
La réalisation d'un projet informatique démarre en général avec un cahier des charges. C'est en gros une description de ce que devrait faire le logiciel.
Voici, le cahier des charges de notre exemple:
On souhaiterait écrire un programme qui calcule la surface à peindre dans une pièce rectangulaire possédant des portes et des fenêtres.
Pour simplifier, on supposera que les murs ont 2m50 de hauteur et que toutes les fenêtres ont la même dimension (1.4 × 1.2) et de même pour les portes (0.9 × 2.1).
Introduisons une constante pour chaque donnée fixe du problème:
const LargeurFenetre = 1.4; HauteurFenetre = 1.2; LargeurPorte = 0.9; HauteurPorte = 2.1; HauteurMur = 2.5;
On pourrait se passer de ces déclarations et mettre directement les valeurs 1.4, 1.2, ... etc dans les calculs, mais on obtiendrait ainsi un code moins lisible et plus difficile à mettre à jour.
S'il faut corriger la hauteur des portes par exemple, il suffit de changer la valeur de la constante et cette modification sera automatiquement répercutée dans tout le code (dans tous les calculs où la hauteur des portes intervient).
La surface à peindre dépendra donc de la taille de la pièce ainsi que du nombre de portes et de fenêtres. Ce seront les données du programme. On en déduit l'interface graphique suivante:
Les zones de texte sont nommées ZT_Largeur (largeur de la pièce), ZT_Longueur (longueur de la pièce), ZT_NF (nombre de fenêtres), ZT_NP (nombre de portes) et ZT_SP (surface à peindre).
Associons une variable à chaque donnée: LargeurPiece, LongueurPiece, NFenetre et NPorte. D'où les déclarations:
Var LargeurPiece, LongueurPiece : Double; NFenetre, NPorte : Integer;
Nous pouvons à présent écrire les instructions de lecture de données dans la procédure évènementielle du bouton Calculer:
procedure TForm1.BT_CalculClick(Sender: TObject); begin // Lecture des données LireNombre (LargeurPiece, ZT_Largeur); LireNombre (LongueurPiece, ZT_Longueur); LireEntier (NFenetre, ZT_NF); LireEntier (NPorte, ZT_NP); end;
Il nous faut maintenant réfléchir à la manière de calculer la surface à peindre. Pour simplifier le problème, nous allons découper le traitement en plusieurs étapes:
Le résultat de chaque étape sera sauvegardé dans une variable: SurfaceDesMurs, SurfaceDesFenetres, SurfaceDesPortes, SurfacePeinture.
Il nous faut d'abord déclarer les nouvelles variables:
Var LargeurPiece, LongueurPiece : Double; NFenetre, NPorte : Integer; SurfaceDesMurs, SurfaceDesPortes, SurfaceDesFenetres, SurfacePeinture : double;
Ecrivons à présent les quatre étapes de calcul:
Calcul de la surface des quatre murs:
SurfaceDesMurs := 2 * (LargeurPiece+LongueurPiece) * HauteurMur;
Calcul de la surface des fenêtres:
SurfaceDesFenetres := NFenetre * LargeurFenetre * HauteurFenetre;
Calcul de la surface des portes:
SurfaceDesPortes := NPorte * LargeurPorte * HauteurPorte;
Calcul de la surface à peindre:
SurfacePeinture := SurfaceDesMurs - SurfaceDesFenetres - SurfaceDesPortes;
Pour conclure, voici le code de la procédure évènementielle du bouton calculer:
procedure TForm1.BT_CalculClick(Sender: TObject); begin //--- Lecture des données LireNombre (LargeurPiece, ZT_Largeur); LireNombre (LongueurPiece, ZT_Longueur); LireEntier (NFenetre, ZT_NF); LireEntier (NPorte, ZT_NP); //--- Traitement des données SurfaceDesMurs := 2 * (LargeurPiece+LongueurPiece) * HauteurMur; SurfaceDesFenetres := NFenetre * LargeurFenetre * HauteurFenetre; SurfaceDesPortes := NPorte * LargeurPorte * HauteurPorte; SurfacePeinture := SurfaceDesMurs - SurfaceDesFenetres - SurfaceDesPortes; // Affichage des résultats AfficherNombre (SurfacePeinture,ZT_SP); end;
Voici un résumé de tous les conseils vus précédemment: