• Aucun résultat trouvé

Chapitre 5 EVOLUTION DU PROJET EM2

5.3. l Implantation du noyau

6.2.3 Couplage

Le couplage caractérise les liens qui existent entre deux modules. Il est influencé par la complexité de l'interface, le type de connexion et la nature des informations échangées.

Classification de Myers

La classification proposée par Myers comporte aussi sept types possibles, qui sont, ordonnés du plus vers le moins désirable:

1. pas de couplage direct 2. couplage par données 3. couplage par timbre 4. couplage par contrôle 5. couplage externe 6. couplage commun 7. couplage par contenu

Ces différentes variétés de couplage permettent de caractériser les liens de dépendance entre les modules. Le premier type de couplage ne représente pas un but à atteindre, puisqu'alors aucun module ne serait lié à un autre, mais il caractérise le fait que deux modules n'ont pas de lien commun. Nous allons passer en revue ces différents types de couplage, en les examinant par ordre croissant.

Deux modules sont couplés par contenu si l'un des deux référence directement l'intérieur de l'autre. Par exemple, un module Fortran qui se branche directement à l'intérieur d'un autre module à l'aide d'un GOTO induit un couplage de ce type. Dans les langages de haut niveau modemes, il est quasiment impossible de créer un tel type de couplage. C'est pour éliminer ce type de couplage que la programmation structurée a vu le jour.

Le couplage commun caractérise des modules qui utilisent les mêmes structures de données hétérogènes et globales. Son appellation commun provient du langage Fortran et plus particulièrement de l'instruction COMMON qui permet de définir une zone de données globale que l'on peut structurer de différentes façons. Ce type de couplage pose de nombreux problèmes. Il est en complète contradiction avec la programmation structurée car l'utilisation de données globales limite la lisibilité d'un programme. Il permet des effets de bord, c'est-à-dire qu'il permet des échanges d'informations sans les déclarer dans l'interface du module, ce qui influence négativement la compréhensibilité du programme. Il introduit aussi des dépendances entre des modules

apparemment indépendants. L'utilisation de variables globales dans un module limite la réutilisation de celui-ci. Ainsi, en langage d'assemblage, une macro-instruction commence par sauver le contenu des différents registres (dont elle va se servir) sur la pile avant d'effectuer des traitements sur ces registres, puis à la fin, elle les recharge. Dans ce cas, les registres ne sont plus considérés comme des variables globales, mais comme des variables locales. De telles macros sont facilement réutilisables et n'ont pas d'effets de bord sur les registres, en tout cas. Généralement, quand on utilise une. variable globale, on n'a besoin que d'une partie de celle-ci, alors que l'ensemble est accessible. Ce type de couplage expose donc un module à plus de données qu'il n'en a besoin. En fait, le problème le plus sérieux est que ce type de couplage empêche de gérer proprement et de contrôler les accès aux données, ce qui représente un facteur vital dans le développement d'un grand projet. Ce dernier aspect a été un obstacle sévère lors du développement et de la maintenance du système d'exploitation OS/360 des machines IBM. Donc, on essaie d'éliminer purement et simplement ce type de couplage, car toute variable globale peut être transformée en un module proposant toutes les opérations dont on a besoin sur cette structure de données. Toutes les références à cette variable s'effectuent donc par l'utilisation des nouvelles opérations associées.

Le couplage externe correspond au même type de couplage que le précédent, mais à la condition supplémentaire que les données globales soient homogènes, par exemple un scalaire ou un tableau d'éléments simples. Ce type de couplage présente pratiquement les mêmes problèmes que précédemment. Il est toujours indésirable.

Le couplage par contrôle caractérise le type d'information transmis entre deux modules. Deux modules sont couplés par contrôle s'ils ne sont pas co1,1plés par un des types précédents et que l'un des deu.x contrôle explicitement la logique de l'autre, c'est-à-dire si le premier module passe explicitement un élément de contrôle à l'autre module. Un élément de contrôle peut être un code de fonction passé à un module ayant une cohésion logique. Un problème est de définir ce qu'est un élément de contrôle, car il arrive fréquemment que la condition d'une instruction conditionnelle porte sur les données. Le problème est résolu en considérant comment le module qui envoie les données considère celles-ci.

S'il considère que celles-ci contrôlent la logique de l'autre module, alors c'est un couplage de ce type, sinon ce n'est pas un tel couplage. De toute façon, on ne préoccupe pas de savoir comment sont utilisées les données.

Ce type de contrôle peut être difficilement évité dans le cas d'un module de traitement d'erreurs. Chaque code d'erreur entraîne un message particulier, donc le paramètre indiquant le codé de l'erreur est un élément de contrôle. Une solution est" d'associer les messages d'erreurs aux modules qui les détectent, mais alors on surcharge inutilement le contenu

de tous les modules. Cette solution rend très difficile la portabilité des messages dans un autre langage.

Le couplage par timbre caractérise deux modules qui n'ont aucun des types de couplage précédents et qui référencent les mêmes données non globales. Les données doivent être passées comme paramètres. Que les données référencées apparaissent dans l'interface du module est une bonne chose, mais cela ne résoud pas les problèmes d'exposition à des données inutiles. Supposons qu'un module n'a besoin que d'une partie d'une structure de données passée comme paramètre, et supposons aussi que l'on ait besoin de modifier un morceau de la structure dans l'autre partie. En principe, le module est indépendant de cette partie puisqu'il ne l'utilise pas, et bien il va quand même devoir être modifié pour s'adapter à la nouvelle structure. Ce type de couplage est largement répandu dans les logiciels. Pour essayer de minimiser le nombre de modules de ce type, il faut essayer d'avoir un coupliige par données en passant comme paramètres simplement les données dont on a besoin. Une seconde méthode possible est d'utiliser des modules ayant une cohésion informationnelle, qui induisent un couplage par données. Une troisième technique, pas très propre, consiste à utiliser des pointeurs comme paramètres.

Le couplage par données caractérise le meil1eur type de couplage entre deux modules. Deux modules sont couplés par données s'ils ne sont pas couplés par aucun des types précédents, que les modules communiquent directement l'un avec l'autre (l'un appelle l'autre) et que toutes les données échangées par fintennédiaire des paramètres sont des données homogènes, c'est-à-dire relativement simples. Ce type de couplage est le seul qui soit réellement désirable, il favorise l'indépendance, la maintenabilité, la flexibilité et la réuLilisation.

Autre classification

Jensen et Tonies [Jen 79] se basent sur les mêmes critères pour établir le couplage entre les modules. Le but recherché est d'avoir toujours le couplage le plus faible possible. Pour le caractériser, ils tiennent compte du type des informations échangées, du type de la connexion et du type de la communication. La figure 6.5 décrit le couplage correspondant à ces divers facteurs.

Le type des informations échangées peut être simple et évident, ce qui diminue le couplage, ou à l'opposé, être complexe et obscure (par exemple, une structure de données bâtie sur d'autres structures de données, ou un pointeur sur une telle structure).

Type des Type de la Type de la informations connexion communication

Faible simple, normal données

couplage évident

l

pathologique

direct Fort

1 c;omplexe, pathologique contrôle couplage obscure indirect

Figure 65: Mesure du couplage selon [Jen 79]

La communication peut être du type données ou contrôle. Le contrôle, comme précédemment, consiste à passer un élément qui contrôle la logique de l'autre module.

Le type de la connexion peut être nonnal (cas le plus favorable), pathologique direct ou pathologique indirecL Une connexion est normale·

si les échanges d'informations s'effectuent par l'intennédiaire des paramètres. Si un module référencie des éléments internes à un autre module, il sont liés par un couplage pathologique direct. En dernier lieu, si les modules accèdent indirectement à des mêmes irûonnations globales, alors, ils sont liés par un couplage pathologique indirect.