• Aucun résultat trouvé

Chapitre 5 EVOLUTION DU PROJET EM2

5.3. l Implantation du noyau

6.2.2 Cohésion

La cohésion caractérise les liens existant entre les éléments d'un module. Elle traduit l'intégrité du module.

Classification de Myers

Il existe différentes classifications. Myers [Mye 78] a classifié la cohésion en sept types possibles, qui sont, ordonnés de la plus à la moins désirable:

1. cohésion fonctionnelle et informationnelle 3. cohésion communicationnelle

4. cohésion procédurale 5. cohésion classique 6. cohésion logique 7. cohésion cofucidentale.

Ces différentes classes caractérisent le fait que le module offre des fonctions plus ou moins liées les unes aux autres. L'idéal serait que tous les modules possèdent one cohésion fonctionnelle ou infonnationnelle, ce qui est réalisable en grande partie (voir chapitre 8). Tout d'abord, nous allons passer en revue ces différents types de cohésion de la moins bonne à la meilleure.

Un module possèdant une cohésion cofncidentale est un module qui répond aux critères suivants: sa fonction ne peut pas être définie (la seule manière de décrire un tel module est de décrire sa logique), ou alors il réalise des fonctions totalement indépendantes les unes des autres. On peut imaginer un module qui pem1~llrail l~ uv~1aüons suivantes: lecture d'un fichier sur disque, affichage de l'heure et de la date, impression d'un dessin sur une imprimante graphique et calcul de la racine carrée d'un nombre réel. Ce type de cohésion est même néfaste au logiciel, et finalement, il vaut mieux ne pas modulariser. A la limite, on peut accepter un seul et unique module de ce type dans un logiciel, et qui regrouperait quelques opérations diverses qui n'ont pas de liens avec d'autres opérations (elles n'ont pas de place logique dans un autre module) et qui ne sont pas assez. conséquentes pour fo.!Tller un module à elles seules.

La cohésion logique caractérise un module qui effectue un ensemble de fonctions relativement dépendantes, dont une est explicitement sélectionnée par le module appelant. En d'autres termes, l'interface du module ayant cette cohésion contient un argument qui permet de sélectionner la fonction désirée. Le problème de ce type de module est qu'une seule interface permet d'accéder à différentes fonctions.

L'interface est donc relativement complexe inutilement, et en plus, elle est difficile à comprendre. Ce type de module est aussi à éviter. Dans certains cas particuliers, on peut l'admettre. Par exemple, un module de traitement d'erreurs, qui effectuent des traitements différents selon les erreurs, appartient à cette catégorie.

La cohésion classique caractérise un module qui offre différentes fonctions séquentielles faiblement liées. Les fonctions séquentielles sont des fonctions caractérisées par le fait qu'elles sont indépendantes les unes des autres, mais qu'elles sont utilisées conjointement, en séquence. Des exemples typiques de cette classe de modules sont les modules regroupant toutes les opérations d'initialisation ou de terminaison. Ainsi, un module qui effectue les opérations d'ouverture des fichiers nécessaires pour le logiciel et les initialisations de variables ou de tables appartient à cette classe de cohésion. Le problème de ce type de module est que les fonctions qui le composent sont faiblement dépendantes les unes des autres, alors qu'en réalité elles sont plus fortement liées à d'autres fonctions se trouvant dans d'autres modules, mais qui traitent les mêmes données. Ainsi une opération d'ouverture d'un fichier est plus fortement liée avec les opérations qui manipulent ce fichier (la lecture, l'écriture ou la fenneture) qu'avec les opérations qui sont effectuées en même temps qu'elle.

La cohésion procédurale caractérise un module qui offre différentes fonctions séquentielles liées par le problème. Ainsi, un tel module est celui qui effectue les différents traitements lorsque l'on rencontre une certaine situation. Ce type de cohésion diffère peu de la précédente, et le même problème se repose: il y a de fortes chances pour que les diverses fonctions soient plus fortement liées à d'autres fonctions se trouvant dans d'autres modules. Ce type de module est toujours à éviter.

La cohésion communicationnelle caractérise un module qui offre différentes fonctions séquentielles liées par le problème, mais où il y a une dépendance due aux données entre ces fonctions. Par exemple, routes les fonctions référencient les mêmes types de données; les données de sortie de la première fonction correspondent aux données d'entrée de la seconde, les données de sortie de la seconde correspondent aux données d'entrée de la troisième, et ainsi de suite.

La cohésion fonctionnelle est le meilleur type de cohésion. Elle caractérise un module qui offre une seule fonction spécifique.

Evidemment, une fonction peut être décomposée en différentes fonctions plus primitives, mais à partir du moment où l'on peut décrire le module par une seule fonction, il possède une telle cohésion. En considérant cet aspect dans le sens inverse, si un ensemble de fonctions peut être décrit collectivement par une seule fonction cohérente, alors le module a aussi ce

type de cohésion. Les actigramrnes définis dans la méthode SADT donnent une bonne illustration de ce type de module. Chaque boîte d'un actigranune contient un verbe qui décrit l'opération correspondante. Mais une boîte peut être décomposée en sous-boîtes, donc une fonction peut être réalisée avec plusieurs fonctions de plus bas niveau. Un module fonctionnel contient donc des fonctions fortement liées par le problème à résoudre.

La cohésion informationnelle caractérise un module qui satisfait les critères suivants: il contient plusieurs points d'entrée, chacun d'eux effectue une seule fonction spécifique, mais toutes sont fortement liées par un concept, une structure de données ou une ressource cachée dans le module. Ce type de module permet donc de cacher un concept, une structure de données ou une ressource à l'intérieur d'un module. Il peanet, en outre, la meilleure indépendance possible entre les modules.

Le concept de type abstrait est issu de cette approche et il a été intégré dans les langages les plus modernes. De plus, ce type de module peut être adopté pour réaliser bon nombre de modules d'un logiciel.

Ces différentes catégories ne sont pas exclusives, un module peut satisfaire à plusieurs d'entre elles, auquel cas on lui attribue la meilleure.

Un problème se pose lorsque l'on désire automatiser l'analyse de cohésion d'un logiciel. En effet, selon Myers [Mye 78], cette automatisation est impossible.

Autre classification

Les divers termes employés pour la classification précédente ne sont pas acceptés conune des standards. Ainsi, dans l'ouvrage publié par la companie General Elcctric Company [Gen 86], la cohésion est classifiée en six l;alégoric:s, yui suul, lvujuw s ordonnées de la moins bonne à la meilleure:

- la cohésion coïncidentale caractérise un ensemble de fonctions sans aucun lien entre elles,

- la cohésion temporelle caractérise un ensemble de fonctions utilisées en même temps dans un logiciel,

- la cohésion procédurale caractérise des fonctions qui effectuent un traitement particulier,

- la cohésion communicationnelle caractérise des fonctions qui référencient les mêmes dormées,

- la cohésion séquentielle caractérise des fonctions dont les données de sortie de l'une sont les données d'entrée d'une autre,

la cohésion fonctionnelle caractérise des fonctions qui contribuent à l'exécution d'une seule fonction bien définie.

Ces catégories sont donc relativement identiques aux précédentes, seules leurs dénominations sont modifiées quelque peu. Par contre, des indications sont proposées pour essayer identifier ces diverses catégories.

Ces indications (figure 6.4) sont basées sur le contenu de la phrase qui décrit le module.

IF sentence is a compound sentence, or contains a comma,

or contains more than one verb

THEN the module probably has cornrnunicational, sequential, or logic cohesion

ELSE IF sentence contains time-oriented words such as first, last, next, after, start, initialize, cleanup, terminate,

THEN the module probably has sequential, procedural, or temporal cohesion

ELSE IF sentence contains a plural or collective abject, THEN the module probably has logical or

cornrnunicational cohesion

ELSE IF sentence makes no sense or contains no continuity of function

THEN the module probably has coincidental cohesion ELSE (none of the above)

the module has functional cohesion .

Figure 6.4 : Indications permettant d'identifier le type de cohésion Les bénéfices d'une bonne cohésion des différents modules d'un logiciel sont manifestes. Le plus important est l'indépendance entre les modules, ce qui entraîne que le traitement des erreurs du logiciel est facilité puisque chaque module effectue un petit nombre de fonctions particulières. Le codage est simplifié puisque la complexité est réduite et la maintenance est grandement facilitée.