Cohesion é uma medida qualitativa, o que significa que o código fonte a ser medido é examinado utilizando uma rubrica para determinar uma classificação. Os tipos de coesão, do pior para o melhor, são os seguintes:
Coesão coincidental (pior) A coesão coincidental é quando partes de um módulo são agrupadas arbitrariamente; a única relação entre as partes é que foram agrupadas (por exemplo, uma classe “Utilities”). Exemplo:
/*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}
coesão lógica A coesão lógica é quando partes de um módulo são agrupadas porque são categorizadas logicamente para fazer a mesma coisa mesmo que sejam diferentes por natureza (por exemplo, agrupando todas as rotinas de manipulação de entradas do rato e teclado). Coesão temporal A coesão temporal é quando partes de um módulo são agrupadas por quando são processadas – as partes são processadas num determinado momento na execução do programa (por exemplo, uma função que é chamada após apanhar uma excepção que fecha ficheiros abertos, cria um registo de erros, e notifica o utilizador). Coesão processual Coesão processual é quando partes de um módulo são agrupadas porque seguem sempre uma determinada sequência de execução (por exemplo, uma função que verifica as permissões dos ficheiros e depois abre o ficheiro). Coesão comunicacional/informacional A coesão comunicacional é quando partes de um módulo são agrupadas porque funcionam com os mesmos dados (por exemplo, um módulo que funciona com o mesmo registo de informação). Coesão sequencial Coesão sequencial é quando partes de um módulo são agrupadas porque a saída de uma parte é a entrada para outra parte como uma linha de montagem (por exemplo, uma função que lê dados de um ficheiro e processa os dados). Coesão funcional (melhor) A coesão funcional é quando partes de um módulo são agrupadas porque todas elas contribuem para uma única tarefa bem definida do módulo (por exemplo, análise léxica de uma string XML). Exemplo:
/*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)}
coesão perfeita (atómica) Exemplo.
/*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}
coesão é um tipo de escala de classificação, as classificações não indicam uma progressão constante de coesão melhorada. Estudos realizados por várias pessoas incluindo Larry Constantine, Edward Yourdon, e Steve McConnell indicam que os dois primeiros tipos de coesão são inferiores; a coesão comunicacional e sequencial são muito boas; e a coesão funcional é superior.
Embora a coesão funcional seja considerada o tipo de coesão mais desejável para um módulo de software, pode não ser alcançável. Há casos em que a coesão comunicacional é o nível mais alto de coesão que pode ser alcançado nas circunstâncias.