La qualité du logiciel est l’objectif du génie logiciel. Ce n’est pas une idée
simple mais un ensemble de facteurs. Les recherches de ces dernières
années concernent la rapidité, la fiabilité, la lisibilité. Nous avons, dans
la première partie, abordée la notion de programmation structurée. Au cours
des travaux pratiques, nous avons utilisé la programmation modulaire.
Du point de vue externe de l’utilisateur, la qualité d’un logiciel
se manifeste par son ergonomie, son efficacité, sa facilité d’emploi.
Du point de vue interne du concepteur, la qualité se fonde sur la
facilité de mise au point, la lisibilité du source et la réutilisabilité.
La maintenance du logiciel est chose coûteuse… en efforts. (cf. Le bug de
l’an 2000). Il convient donc de s’orienter vers une simplification et une
clarification du travail par :
La modularité. On décompose le programme en autant de fichiers
que nécessaire afin de réduire les difficultés. Cette décomposition
logique et sensée, vise à favoriser la réutilisabilité
des modules. En particulier, il est adroit de décomposer le problème afin
qu’un changement de spécification n’induise la réécriture que d’un seul
module. D’autre part, les données d’un module lui sont
propres\footnote{C’est l’encapsulation. page suivante} et
protégées. L’accès aux données se fait par interfaces c’est à dire
des méthodes (.e. des fonctions) appartenant aux modules, accessibles
depuis d’autres modules.
La réutilisabilité. Il est agréable de pouvoir utiliser le
même module quelque soit le type de données traitées. Pourquoi réécrire un
calcul de moyenne sur des entiers si l’on dispose déjà du même calcul sur
des réels ? De même, les travaux récents sur les interfaces homme/machine (ihm),
révèle l’importance de disposer de modules indépendant de la présentation
et pouvant être utilisés avec différentes présentations (html, fvwm ou tk)
La certification. Il n’existe pas (encore) de solution pour
une réalisation parfaite des logiciels. Il est cependant possible
d’inclure des éléments de spécification parmi les lignes de code. C’est
notamment le cas en langage C avec la macro assert. Nous l’avons
abondamment utilisé dans la première partie. En voici un autre exemple :
#include
main()
{
int a, b, u, x , y ;
scanf ("%d%d", &x, &y) ;
a = x ; b = y ;
u = x + y ;
u = u + u ;
x = x + y ;
u = u - x ;
assert ( u == (a + b)) ;
assert ( x == (a + b)) ;
printf ("u :%d, x = %d\n", u, x) ;
}
On utilisera cette technique afin de garantir que les conditions
d’utilisation des modules sont respectées. Par exemple, la méthode de retrait
d’un élément d’une pile s’assurera que la pile n’est pas vide.
Les assertions contribuent à réaliser du logiciel correct, aident à la
documentation, facilitent le déboguage et la tolérance de pannes.