Functional Cohesion
A functional-strength module is defined as a module that performs a single specific function. -- Meyers, in Composite structured design (opens in a new tab)
Cada elemento essencial para uma única computação está contido no componente. Portanto, o componente funcionalmente coeso é:
Aquele que não apenas executa a tarefa para a qual foi projetado, mas ele executa apenas essa função e nada mais.
Coesão funcional é sobre o último: é sobre ter um módulo, um pacote, um componente que serve a um propósito específico. Você pode, por exemplo, ter:
Exemplo: uma biblioteca de strings que oferece um conjunto muito rico de funções de programação (concatenação, pesquisa, substituição), mas todas servem a um propósito comum de trabalhar com strings. Portanto, há uma coesão funcional.
A coesão é uma medida ordinal, ou seja, alta ou baixa coesão. A alta coesão geralmente se correlaciona com o acoplamento fraco e e a baixa coesão com acoplamento forte e baixa confiabilidade e robustez.
Se os métodos que atendem a uma classe tendem a ser semelhantes em muitos aspectos, diz-se que a classe tem alta coesão. Em um sistema altamente coeso, a legibilidade e a reutilização do código são aumentadas, enquanto a complexidade é mantida gerenciável.
A coesão é aumentada se:
- As funcionalidades embutidas em uma classe, acessadas por meio de seus métodos, têm muito em comum.
- Os métodos realizam um pequeno número de atividades relacionadas, evitando conjuntos de dados grosseiros ou não relacionados.
- Os métodos relacionados estão no mesmo arquivo de origem ou agrupados de outra forma; por exemplo, em arquivos separados, mas no mesmo subdiretório.
As vantagens da alta coesão (ou "coesão forte") são:
- Complexidade reduzida do módulo (são mais simples, com menos operações).
- Maior capacidade de manutenção do sistema , porque as alterações lógicas no domínio afetam menos módulos e porque as alterações em um módulo exigem menos alterações em outros módulos.
- Maior capacidade de reutilização do módulo, porque os desenvolvedores de aplicativos encontrarão o componente de que precisam com mais facilidade entre o conjunto coeso de operações fornecidas pelo módulo.
Tipos de coesão
- Coincidental cohesion (worst)
/*
Groups: The function definitions
Parts: 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
}- Logical cohesion
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, agrupar todas as rotinas de manipulação de entrada de mouse e teclado ou agrupar todos os modelos, visualizações e controladores em pastas separadas em um padrão MVC).
- Temporal cohesion
Coesão temporal é quando partes de um módulo são agrupadas por quando são processadas - as partes são processadas em um determinado momento na execução do programa (por exemplo, uma função que é chamada após capturar uma exceção que fecha arquivos abertos, cria um log de erros e notifica o usuário).
- Procedural cohesion
Coesão procedimental é quando partes de um módulo são agrupadas porque sempre seguem uma certa sequência de execução (por exemplo, uma função que verifica as permissões do arquivo e depois abre o arquivo).
- Communicational cohesion
Coesão comunicacional é quando partes de um módulo são agrupadas porque operam nos mesmos dados (por exemplo, um módulo que opera no mesmo registro de informações).
- Sequencial cohesion
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 arquivo e processa os dados).
- Functional cohesion
Coesão funcional é quando partes de um módulo são agrupadas porque todas contribuem para uma única tarefa bem definida do módulo (por exemplo, análise léxica de uma string XML). Exemplo:
/*
Groups: The function definitions
Parts: 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) = [Module A].a([Module A].b(5, x), 3)
}- Perfect cohesion (atomic)
Module A {
// Implementation of r(x) = 2x + 1 + 3x + 2
// Diz-se que tem coesão perfeita porque não pode ser reduzido mais do que isso
r(x) = 5x + 3
}