[Arquitetura] Coupling, o inimigo em comum - Parte 3
Continuando nosso papo sobre o “Coupling, o inimigo em comum”, hoje chegamos em Connascence, que é uma métrica que nos permite avaliar o quão flexível está nosso código.
Temos dois tipos de Connascence: Estático e Dinâmico.
Static Connascence é quando temos “afferent” ou “efferent” coupling em nosso código, sendo eles:
Connascence de nome (CoN): Quando temos que concordar com o nome de alguma coisa, exemplo: O nome do arquivo, da classe, função, etc.
Connascence de tipo (CoT): Quanto temos que concordar com o tipo de algo, por exemplo, se uma função recebe um parâmetro do tipo inteiro, não podemos passar uma String.
Connascence de significado (CoM) / Connascence de convenção (CoC): Quanto temos que concordar com um valor em particular de alguma coisa. Como por exemplo: A fim de evitar números mágicos, eu crio uma variável X que representa algo. Todos componentes que vão utilizar essa variável, vão ter que aceitar seu valor.
Connascence de posição (CoP): Quando temos que seguir algo em uma ordem específica, por exemplo, argumentos de uma função, se é function(name, age) você não pode passar function(32, ‘João’).
Connascence de algoritmo (CoA): Quando temos que concordar com um algoritmo específico. Por exemplo: Basic Auth, os dados estão codificados em base64, se queremos ter acesso a eles, vamos ter que decodificar em base64.
Dynamic Connascence é quando acontece em run-time, tipo o temporal-coupling, assim temos:
Connascence de execução (CoE): Quando a ordem da execução importa, por exemplo, não podemos fazer um commit de uma transação sem antes iniciá-la.
Connascence de tempo (CoT): Quando o tempo da execução de múltiplos componentes é importante, por exemplo, quando trabalhamos em um ambiente multi-threading, a fim de evitar uma race condition.
Connascence de valor (CoV): Quando diversos valores precisam ser mudados juntos, por exemplo, temos uma imagem. Se fomos redimensioná-la, precisamos alterar toda sua dimensão para não distorcê-la.
Connascence de identidade (CoI): Quando diversos componentes referem-se a um valor em particular, por exemplo, o número de post de um blog, a cada post criado vai aumentá-lo e esse número vem da criação de post de cada escritor que existe no blog.
Connascence é para ser usado como uma ferramenta de análise, sendo assim, temos algumas propriedades importantes para nos auxiliar:
- Força: Assim como coupling temos diferentes níveis de quão hard vai ser mexer naquilo, Connascence estáticos são mais fracos que Dinamicos.
- Localização: Mostra o quão próximo um componente/módulo está próximo um do outro, por exemplo, ter classes dentro do mesmo Namespace/Package é bem melhor do que em outro lugar (coesão).
- Grau: O quão grande é o tamanho de tudo isso? Tem vários arquivos ou apenas algumas classes?
Com isso estabelecemos um objetivo em nossas aplicações, sempre buscar diminuir a Connascence em nossa arquitetura. A maneira para fazer isso é sempre tentar deixar o máximo de Connascence estático para reduzir a força delas. Lembre-se também sempre das seguintes regras: converter tipos mais fortes em mais fracos e diminuir a distância entre elementos semelhantes (coesão). Por exemplo, é melhor ter um método que recebe um objeto (CoT) do que receber vários argumentos (CoP).
Tchau tchau!