Coesão (ciência da computação)

Na programação de computadores , coesão refere-se ao grau em que os elementos dentro de um módulo pertencem entre si . [1] Em certo sentido, é uma medida da força do relacionamento entre os métodos e dados de uma classe e algum propósito ou conceito unificador servido por essa classe. Em outro sentido, é uma medida da força do relacionamento entre os métodos da classe e os próprios dados.

A coesão é um tipo de medida ordinal e geralmente é descrita como “alta coesão” ou “baixa coesão”. Módulos com alta coesão tendem a ser preferíveis, porque a alta coesão está associada a vários traços desejáveis ​​de software, incluindo robustez , confiabilidade, capacidade de reutilização e compreensibilidade. Em contraste, a baixa coesão está associada a características indesejáveis, como ser difícil de manter, testar, reutilizar ou mesmo compreender.

A coesão é frequentemente contrastada com o acoplamento . A alta coesão geralmente está correlacionada com um acoplamento fraco e vice-versa. [2] As métricas de software de acoplamento e coesão foram inventadas por Larry Constantine no final da década de 1960 como parte do Design Estruturado , com base em características de “boas” práticas de programação que reduziam os custos de manutenção e modificação. Design Estruturado, coesão e acoplamento foram publicados no artigo Stevens, Myers & Constantine (1974) [3] e no livro Yourdon & Constantine (1979); [1] os dois últimos posteriormente se tornaram termos padrão em engenharia de software .

Alta coesão

Na programação orientada a objetos , se os métodos que atendem uma classe tendem a ser semelhantes em muitos aspectos, então diz-se que a classe tem alta coesão. [4] Em um sistema altamente coeso, a legibilidade e a reutilização do código aumentam, enquanto a complexidade é mantida gerenciável.

Coesão

A coesão aumenta se:

  • As funcionalidades incorporadas em uma classe, acessadas através de seus métodos, têm muito em comum.
  • Os métodos realizam um pequeno número de atividades relacionadas, evitando conjuntos de dados granulados 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/pasta.

As vantagens da alta coesão (ou "forte coesão") são:

  • Complexidade reduzida dos módulos (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 no conjunto coeso de operações fornecido pelo módulo.

Embora, em princípio, um módulo possa ter coesão perfeita consistindo apenas em um único elemento atômico – tendo uma única função, por exemplo – na prática, tarefas complexas não podem ser expressas por um único elemento simples. Assim, um módulo de elemento único possui um elemento que é muito complicado, para realizar uma tarefa, ou é muito estreito e, portanto, fortemente acoplado a outros módulos. Assim, a coesão é equilibrada tanto com a complexidade da unidade quanto com o acoplamento.

Tipos de coesão

A coesão é uma medida qualitativa, o que significa que o código-fonte a ser medido é examinado usando uma rubrica para determinar uma classificação. Os tipos de coesão, do pior ao melhor, são os seguintes:

Coesão coincidente (pior)
A coesão coincidente ocorre quando partes de um módulo são agrupadas arbitrariamente; a única relação entre as partes é que elas foram agrupadas (por exemplo, uma classe “Utilitários”). Exemplo:
/* 
Grupos: As definições da função 
Partes: Os termos de cada função 
*/ 
Módulo A { /*   Implementação de r(x) = 5x + 3   Não há nenhuma razão específica para agrupar funções desta forma,   então diz-se que o módulo tem Coesão Coincidente.   */ r ( x ) = a ( x ) + b ( x ) a ( x ) = 2 x + 1 b ( x ) = 3 x + 2 }  
  



 
       
      
      

Coesão lógica
A coesão lógica ocorre quando partes de um módulo são agrupadas porque são categorizadas logicamente para fazer a mesma coisa, embora 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 ).
Coesão temporal
A coesão temporal ocorre 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).
Coesão processual
A coesão processual ocorre quando partes de um módulo são agrupadas porque sempre seguem uma determinada sequência de execução (por exemplo, uma função que verifica as permissões do arquivo e depois abre o arquivo).
Coesão comunicacional/informacional
A coesão comunicacional ocorre 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).
Coesão sequencial
A coesão sequencial ocorre 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).
Coesão funcional (melhor)
A coesão funcional ocorre 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 lexical de uma string XML). Exemplo:
/* 
Grupos: As definições da função 
Partes: Os termos de cada função 
*/ 
Módulo A { /*   Implementação de operações aritméticas   Diz-se que este módulo tem coesão funcional porque   existe a intenção de agrupar operações aritméticas simples   nele.   */ uma ( x , y ) = x + y b ( x , y ) = x * y }  
  





       
       


Módulo B { /*   Módulo B: Implementa r(x) = 5x + 3   Pode-se dizer que este módulo tem coesão atômica. Pode-se também dizer que todo o   sistema (com os Módulos A e B como partes) tem   coesão funcional, porque ambas as suas partes têm finalidades específicas separadas.   */ r ( x ) = [ Módulo A ]. uma ([ Módulo A ]. b ( 5 , x ), 3 ) }  
  





        

Coesão perfeita (atômica)
Exemplo.
/* 
Grupos: As definições da função 
Partes: Os termos de cada função 
*/ 
Módulo A { /*   Implementação de 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 ) = 5 x + 3 }  
  



      

Embora a coesão seja um tipo de escala de classificação, as classificações não indicam uma progressão constante de melhoria da coesão. Estudos realizados por várias pessoas, incluindo Larry Constantine , Edward Yourdon e Steve McConnell [5] 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.

Veja também

Referências

  1. ^ ab Yourdon, Edward ; Constantino, Larry LeRoy (1979) [1975]. Design Estruturado: Fundamentos de uma Disciplina de Projeto de Programas e Sistemas de Computador . Yourdon Press. Bibcode :1979sdfd.book.....Y. ISBN 978-0-13-854471-3.
  2. ^ Ingeno, Joseph (2018). Manual do arquiteto de software . Publicação de pacotes . pág. 175. ISBN 978-178862406-0.
  3. ^ Stevens, Wayne P .; Myers, Glenford J .; Constantine, Larry LeRoy (junho de 1974). “Projeto estruturado”. Diário de Sistemas IBM . 13 (2): 115–139. doi :10.1147/sj.132.0115.
  4. ^ Marsic, Ivan (2012). Engenharia de software . Universidade Rutgers .
  5. ^ McConnell, Steve (junho de 2004) [1993]. Código completo (2 ed.). pp. 168-171. ISBN 978-0-7356-1967-8.

links externos

  • Definições de métricas de coesão
  • Métricas de coesão
  • Medindo a coesão em Python
Obtido em "https://en.wikipedia.org/w/index.php?title=Cohesion_(computer_science)&oldid=1159178637"