Medindo e Entendendo Acoplamento
Algo muito falado quando estamos construindo um sistema é o tal de “acoplamento”, mas afinal, o que isso significa e como podemos medí-lo? Acoplamento é a medida do nível de interdependência entre os módulos, ou seja, são as dependências entre os códigos.
Existem alguns tipos de acoplamento:
- Acoplamento de informação (Data Coupling): As partes são independentes umas as outras e se comunicão através de informações.
- Acoplamento de carimbo (Stamp Coupling): Estruturas de informações são passadas de uma parte à outra.
- Acoplamento de controle (Control Coupling): As partes que se comunicam passam informações de controles, ou seja, parâmetros que indicam comportamentos completamente diferentes.
- Acoplamento externo (External Coupling): Quando partes dependem de outras partes.
- Acoplamento comum (Common Coupling): Quando partes dependem de informações ou estruturas globais.
- Acoplamento de conteúdo (Content Coupling): Uma parte pode modificar a informação de outra parte ou o fluxo de controle é passado entre partes.
Todos esses tipos de acoplamentos possuem seus trade-off, ou seja, às vezes vamos ter mais de um tipo e menos de outro (dependendo da situação e contexto).
Além dos tipos de acoplamento também existem duas categorias de acoplamento:
- Acoplamento apropriado (Appropriate Coupling): Você sabe que existe, está tudo bem existir e/ou deveria existir.
- Acoplamento não apropriado (Unappropriate Coupling): Você não sabe que existe ou se sabe não deveria existir.
Medindo acoplamento
Uma das formas de medir o acoplamento é através do Acoplamento Aferente (Afferent Coupling) e Acoplamento Eferente (Efferent Coupling) ou Incoming Coupling ou Outgoing Coupling.
- Acoplamento Aferente: Mede o número de conexões de entrada aos códigos, exemplo: Componentes, Classes, Funções, etc…
- Acoplamento Eferente: Mede o número de conexões que sai dos códigos.
Medindo abstrações
Abstrações é a proporção de artefatos abstratos para artefatos concetros, ela representa uma medida entra abstrações e implementações.
A equação que define tal métrica pode ser representada da seguinte forma:
Nessa equação ma
representa elementos abstratos (interfaces ou classes abstratas) com o módulo e mc
representa elementos concretos (classes não abstratas).
Exemplo: Imagine uma aplicação com 5.000 linhas de código, todas em uma única função main
, o numerador de abstração é 1
enquanto o denominador é 5000
.
Medindo instabilidade
Instabilidade é uma métrica derivada, definida como a proporção de acoplamento eferente à soma de ambos (aferente e eferente). Ela determina a volatilidade da base de código, uma base de código que possuí um alto nível de instabilidade quebra mais facilmente quando mudada por causa do alto acoplamento.
A equação que define tal métrica pode ser representada da seguinte forma:
Na equação ce
representa acoplamento (coupling) eferente (efferent) (ou que sai (outgoing)) e ca
representa acoplamento (coupling) aferente (afferent) (ou que entra (incoming)).
Distância da sequência principal
A métrica de distância imagina um realcionamento ideal entre abstrações e instabilidades.
A equação que define tal métrica pode ser representada da seguinte forma:
Nessa equação A
representa o resultado da equação de abstrações e I
representa o resultado da equação de instabilidade.
Ambos abstrações e instabilidade são frações do qual o resultado irá sempre ficar entre 0 e 1. Então quando formamos um gráfico podemos ver:
Ao aplicar tais métricas para uma classe particular, isso nos permite calcular a distância da classe da sequência principal:
Olhando para a linha, conseguimos extrais mais informações, por exemplo:
- Classes mais próximas da linha são melhor equilibradas.
- Classes que sobem muito entram na zona de inutilidade (zone of uselessness).
- Classes que caem muito entram na zona de dor (zone of pain).
Onde:
- Zone de inutilidade: Código que é muito abstrato se torna dificil de usar.
- Zone de dor: Código com muita implementação e não tem abstrações o suficiente se torna frágil e dificil de manter.
Conclusão
Nesse post vimos e entendemos um pouco sobre acoplamentos (tipos e categorias) e sobre algumas métricas que podemos tirar referente à tal aspecto de arquitetura dos nossos sistemas.
Abraços, até a próxima.