La cohésion est une mesure qualitative, ce qui signifie que le code source à mesurer est examiné à l’aide d’une rubrique pour déterminer une classification. Les types de cohésion, du pire au meilleur, sont les suivants:
Cohésion coïncidente (pire) La cohésion coïncidente est lorsque les parties d’un module sont regroupées arbitrairement ; la seule relation entre les parties est qu’elles ont été regroupées (par exemple, une classe « Utilitaires »). Exemple:
/*Groups: The function definitionsParts: The terms on each function*/Module A{ /* Implementation of r(x) = 5x + 3 There is no particular reason to group functions in this way, so the module is said to have Coincidental Cohesion. */ r(x) = a(x) + b(x) a(x) = 2x + 1 b(x) = 3x + 2}
Cohésion logique On parle de cohésion logique lorsque des parties d’un module sont regroupées parce qu’elles sont logiquement catégorisées pour faire la même chose, même si elles sont différentes par nature (par exemple, le regroupement de toutes les routines de traitement des entrées souris et clavier). Cohésion temporelle On parle de cohésion temporelle lorsque les parties d’un module sont regroupées en fonction du moment où elles sont traitées – les parties sont traitées à un moment particulier de l’exécution du programme (par exemple, une fonction appelée après la capture d’une exception qui ferme les fichiers ouverts, crée un journal des erreurs et informe l’utilisateur). Cohésion procédurale On parle de cohésion procédurale lorsque les parties d’un module sont regroupées parce qu’elles suivent toujours une certaine séquence d’exécution (par exemple, une fonction qui vérifie les autorisations des fichiers, puis ouvre le fichier). Cohésion communicationnelle/informationnelle On parle de cohésion communicationnelle lorsque des parties d’un module sont regroupées parce qu’elles opèrent sur les mêmes données (par exemple, un module qui opère sur le même enregistrement d’informations). Cohésion séquentielle On parle de cohésion séquentielle lorsque les parties d’un module sont regroupées parce que la sortie d’une partie est l’entrée d’une autre partie, comme une chaîne de montage (par exemple, une fonction qui lit les données d’un fichier et les traite). Cohésion fonctionnelle (meilleure) On parle de cohésion fonctionnelle lorsque les parties d’un module sont regroupées parce qu’elles contribuent toutes à une seule tâche bien définie du module (par exemple, l’analyse lexicale d’une chaîne XML). Exemple:
/*Groups: The function definitionsParts: The terms on each function*/Module A { /* Implementation of arithmetic operations This module is said to have functional cohesion because there is an intention to group simple arithmetic operations on it. */ a(x, y) = x + y b(x, y) = x * y}Module B { /* Module B: Implements r(x) = 5x + 3 This module can be said to have atomic cohesion. The whole system (with Modules A and B as parts) can also be said to have functional cohesion, because its parts both have specific separate purposes. */ r(x) = .a(.b(5, x), 3)}
Cohésion parfaite (atomique) Exemple.
/*Groups: The function definitionsParts: The terms on each function*/Module A { /* Implementation of r(x) = 2x + 1 + 3x + 2 It's said to have perfect cohesion because it cannot be reduced any more than that. */ r(x) = 5x + 3}
Bien que la cohésion soit une échelle de type classement, les rangs n’indiquent pas une progression régulière de l’amélioration de la cohésion. Des études menées par diverses personnes, dont Larry Constantine, Edward Yourdon et Steve McConnell, indiquent que les deux premiers types de cohésion sont inférieurs ; la cohésion communicationnelle et séquentielle est très bonne ; et la cohésion fonctionnelle est supérieure.
Bien que la cohésion fonctionnelle soit considérée comme le type de cohésion le plus souhaitable pour un module logiciel, elle peut ne pas être réalisable. Dans certains cas, la cohésion communicationnelle est le plus haut niveau de cohésion qui puisse être atteint dans les circonstances.
La cohésion fonctionnelle est considérée comme le type de cohésion le plus souhaitable pour un module logiciel.