La cohesión es una medida cualitativa, lo que significa que el código fuente que se va a medir se examina utilizando una rúbrica para determinar una clasificación. Los tipos de cohesión, del peor al mejor, son los siguientes:
La cohesión coincidente (peor) La cohesión coincidente es cuando las partes de un módulo se agrupan arbitrariamente; la única relación entre las partes es que han sido agrupadas (por ejemplo, una clase «Utilidades»). Ejemplo:
/*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}
Cohesión lógica La cohesión lógica es cuando las partes de un módulo se agrupan porque están lógicamente categorizadas para hacer la misma cosa aunque sean diferentes por naturaleza (por ejemplo, agrupar todas las rutinas de manejo de entradas de ratón y teclado). Cohesión temporal La cohesión temporal se produce cuando las partes de un módulo se agrupan según el momento en que se procesan: las partes se procesan en un momento determinado de la ejecución del programa (por ejemplo, una función que se llama después de capturar una excepción que cierra los archivos abiertos, crea un registro de errores y notifica al usuario). Cohesión procedimental La cohesión procedimental se produce cuando las partes de un módulo se agrupan porque siempre siguen una determinada secuencia de ejecución (por ejemplo, una función que comprueba los permisos de un archivo y luego lo abre). Cohesión comunicacional/informacional La cohesión comunicacional se produce cuando las partes de un módulo se agrupan porque operan con los mismos datos (por ejemplo, un módulo que opera con el mismo registro de información). Cohesión secuencial La cohesión secuencial se produce cuando las partes de un módulo se agrupan porque la salida de una parte es la entrada de otra, como en una cadena de montaje (por ejemplo, una función que lee datos de un archivo y los procesa). Cohesión funcional (mejor) La cohesión funcional es cuando las partes de un módulo se agrupan porque todas contribuyen a una única tarea bien definida del módulo (por ejemplo, el análisis léxico de una cadena XML). Ejemplo:
/*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)}
Cohesión perfecta (atómica) Ejemplo.
/*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}
Aunque la cohesión es una escala de tipo ranking, los rangos no indican una progresión constante de mejora de la cohesión. Los estudios realizados por varias personas, como Larry Constantine, Edward Yourdon y Steve McConnell, indican que los dos primeros tipos de cohesión son inferiores; la cohesión comunicacional y la secuencial son muy buenas; y la cohesión funcional es superior.
Aunque la cohesión funcional se considera el tipo de cohesión más deseable para un módulo de software, puede no ser alcanzable. Hay casos en los que la cohesión comunicacional es el nivel más alto de cohesión que puede alcanzarse dadas las circunstancias.