• Aucun résultat trouvé

Flots et structures de données

Chapitre 5 EVOLUTION DU PROJET EM2

5.3. l Implantation du noyau

7.1.4 Flots et structures de données

Un défaut majeur des métriques précédentes est de ne pas tenir compte des données d'un programme, tant au niveau de leur structure, que du flot qu'elles engendrent lors de l'exécution. Nous allons voir maintenant quelques métriques qui prennent ces éléments en considération.

Distance entre les références des données

Cette technique, donnée sous le nom span between data references [Har 82], est basée sur la localisation des données et de leurs références à l'intérieur d'un programme. La distance entre deux références, distance inter-références d'une donnée est égale au nombre d'instructions se trouvant entre ces deux références et ne contenant pas de références à cette donnée. En conséquence, une donnée qui est référencée n fois dans un programme a n-1 distances inter-références. ·

Une étude [Els 76] portant sur 120 programmes, écrits en PL/l, et utilisés dans une grande entreprise a montré que plus de 13% de ces programmes ont des distances inter-références de plus de 100 instructions. Aucune étude particulière n'a été réalisée pour définir le degré de corrélation entre cette mesure et la tâche de maintenance.

Cependant, on imagine facilement que plus les références sont éloignées, plus il est difficile de s'en souvenir. Celle mesure !!SL ùum; ùir~clemenl

proportionnelle à l'effort de compréhension, qui est un facteur de la maintenance.

Couple segment-variable globale

Cette métrique, dont l'appeUation originale est segment-global usage pair, a été proposée par Basili et Turner [Bas 75). Elle mesure la complexité d'un programme en fonction de l'utilisation de variables globales dans le programme. Elle est utile pour des programmes comportant un certain nombre de segments (des procédures ou des fonctions) et elle a pour but de pénaliser les effets de bord. Il faut remarquer que dans ce contexte une variable globale est globale à l'intérieur d'un module.

Un couple segment-variable globale (p,r) est utilisé pour indiquer que le segment p utilise une variable globale r. Donc, r est accédée à l'intérieur de p. La valeur AUP (actual usage pair) est égale au nombre de variables globales référencées à l'intérieur d'un segment. La valeur PUP (potential usage pair) représente le nombre de variables globales potentiellement référençables à l'intérieur d'un segment. A partir de ces valeurs, on calcule le pourcentage relatif RUP de la manière suivante:

RUP =AUP/ PUP. Cette mesure calcule la probablilité qu'un certain segment utilise une certaine variable globale. Plus cette probabilité est grande, plus on a de chances pour qu'une variable globale soit utilisée à l'intérieur d'un segment.

Cette mesure, relativement ancienne, soulève le problème de l'utilisation de variables globales dans un programme comportant des procédures ou des fonctions. De nombreuses études ont prouvé que de telles utilisations engendrent des effets de bord, et que la maintenance de tels programmes est plus difficile gue celle de programmes qui sont mieu){

structurés. De plus, la mesure proposée repose sur un taux relatif d'utilisation, alors qu'il faut mieux tenir compte de la valeur AUP, et dans un deuxième temps de la valeur RUP. Une mesure plus réaliste consisterait à considérer le couple (AUP, RUP).

Une métrique semblable [Tai 84

J

permet de mesurer la complexité du flot de données à l'intérieur d'un programme. La différence réside principalement dans le fait que cette nouvelle métrique évalue l'utilisation des données dans chaque structure de contrôle et pas seulement dans les segments du type procédure.

Flot d'information

Selon Henry et Kafura [Hen 81

J,

la complexité dépend de deux facteurs: la complexité du code des procédures et la complexité des connexions entre les procédures. Leur métrique est basée principalement sur les flots de données locaux aux procédures et sur le flot de données globales.

La complexité associée à une procédure est la suivante:

longueur x (fan-in x fan-out) 2

où longueur représente la longueur au sens de Halstead.

Le flot des données globales est calculé comme suit:

(w x r) + (w x rw) + (rw x r) + (rw (rw-1))

où w représente le nombre de variables modifiées, r le nombre de variables lues, et rw le nombre de variables lues et modifiées.

Cette métrique a été appliquée au noyau d'Unix. Les procédures ont une complexité variant entre 4 et 27 432 000. C'est une des premières métriques qui ne se contente pas d'examiner le code des procédures, mais qui tient compte aussi de leurs connexions. Une étude a montré que cette métrique est un bon indicateur des occurrences des erreurs.

MesureQ

La mesure Q, définie par Chapin [Cha 79], est basée sur le rôle des données à l'intérieur d'un segment. Il y a quatre types de rôles possibles, qui sont:

- P : caractérise des données d'entrée utilisées dans un segment pour produire des données de sortie,

- M : caractérise des données modifiées ou créées dans un segment, - C : caractérise des données utilisées pour contrôler l'exécution

d'un segment,

- T : caractérise des données utilisées, mais non modifiées, par un segment.

Les données peuvent avoir plusieurs rôles dans des segments différents ou dans le même segment; si tel est le cas, on comptabilise chacun d'eux. Chapin a observé que les données de chaque catégorie ont une .influence différente sur la complexité. Par exemple, les données C ont la plus grande influence sur la complexité du programme. Ensuite, on trouve les données M et P qui ont aussi une certaine influence, et, en dernier, on trouve les données T qui n'ont pas une grande influence.

Une première évaluation de la complexité est obtenue en comptant le nombre de données des types C, P et T des données d'entrée, et le nombre de données M et T de celles de sortie. Chapin suggère ensuite, pour chaque segment, de pondérer le nombre des données de chaque type, par un facteur dépendant de l'influence de cette catégorie sur la complexité. Ainsi, le nombre de données C est multiplié par 3, le nombre des données M par 2, les données P par 1, et les C par 0.5. Les valeurs pondérées obtenues sont additionnées pour former une mesure intermédiaire, appelée W'.

Pour calculer la mesure finale, on doit tenir compte d'un facteur R de répétition. Ce facteur est différent de 0, si un segment fait appel répétitivement à d'autres segments. Sa valeur varie suivant que les données contrôlant la répétition (l'itération) pcovienne de segments appelés ou non. La complexité Q, propre à un segment, est obtenue en

multipliant ce facteur R par la valeur W' et en en prenant la racine. Pour finir, la complexité du programme est égale à la moyenne arithmétique de la complexité des segments.

La difficulté majeure de cette méthode réside dans l'évaluation des rôles des données, car il n'est pas toujours facile de détecter lequel ou lesquels sont effectifs. De plus, aucune étude particulière n'a été effectuée pour prouver la corrélation entre cette mesure et la maintenance, et cette métrique n'est pas très intuitivement compréhensible.

Nous verrons dans le paragraphe 7 .2, que la métrique EM2/Complex propose une autre approche, dérivée du polynôme caractéristique, pour évaluer la complexité des structures de données

pr~sentes dans un programme.