Como posso saber se o software é altamente acoplado?

16

Estou familiarizado com o termo "altamente acoplado", mas estou curioso para saber se existem sinais (odores de código) que podem indicar que o código está altamente acoplado. Atualmente, estou trabalhando com Java EE, mas isso pode se aplicar a qualquer idioma.

Editar:

Caso alguém esteja interessado, este artigo parece útil: Em busca da qualidade do código: Cuidado com o casal apertado! (IBM)

Jon Onstott
fonte
1
Regra básica: se você fizer uma pequena alteração, pressionar compilar e tiver tempo para ir ao banheiro, é muito acoplado.
Uri

Respostas:

15

O indicador número um de módulos mal acoplados, na minha opinião, são dependências bilaterais. Por exemplo, o Módulo1 chama alguma função no Módulo2 e o Módulo2 chama alguma função no Módulo1.

A maioria das interfaces deve ser unidirecional. Se o módulo chamado precisar passar algumas informações para o módulo de chamada que não é retornado como parte da chamada, ele deve usar algum tipo de passagem de mensagem ou mecanismo de acionamento de evento, como uma fila de mensagens. Idealmente, o identificador para a interface de passagem de mensagens deve ser passado durante algum processo de inicialização ou registro. Isso abstrai completamente a interface de tal maneira que o módulo não se importa com quem é o evento ... portanto, é dissociado.

Outra indicação é quando um módulo está constantemente chamando outro módulo para algum conjunto de dados específico. Isso deve fazer você questionar quem realmente deve ser o proprietário do conjunto de dados. Por que este módulo em questão sempre precisa ver dados que pertencem a algum outro módulo?

Uma terceira ferramenta, por assim dizer, é perguntar a si mesmo: "Posso retirar este módulo e substituí-lo sem exigir alterações em outros módulos.

Esta não é de forma alguma uma lista exaustiva, mas são as três principais coisas que me pergunto ao projetar software.

Pemdas
fonte
2
+1 para dependências bilaterais. Eles são o coração sombrio do puro mal.
Adam Crossland
16

O antigo ditado de design é: "Você pode tocar seus amigos e seus amigos. Mas você não pode tocar seus amigos." Isso é acoplamento em poucas palavras.

Sinais de código altamente acoplado incluem interfaces muito grandes que permitem que as pessoas saibam detalhes particulares da implementação e objetos que parecem "saber muito um do outro". Existem ferramentas para análise automática que sinalizarão códigos que parecem fortemente acoplados a você. Consulte http://www.scitools.com/features/metricsintro.php para obter uma aleatória. (Não tenho ideia de como funciona. Ele apareceu bastante alto em uma pesquisa no Google.)

btilly
fonte
7

Tente escrever alguns testes de unidade para as aulas. Se você não pode testar facilmente as classes sem a necessidade de criar / simular cargas de classes de suporte ou de um db / ui, então é um sinal claro de um acoplamento / dependências ruins.

É também uma das melhores curas, mas você precisa fazer isso durante a codificação (como TDD) para ser honesto.

Alva
fonte
+1. Minha opinião favorita é não ser capaz de instanciar o objeto de negócio por conta própria E validar todas as suas próprias regras de negócio. Normalmente, vê-se uma regra de "valor necessário", por exemplo, implementada na interface do cliente, mas não no próprio objeto. É bom colocá-lo na interface do usuário (por considerações de desempenho, digamos), mas DEVE estar no próprio objeto de negócios.
Radarbob
6

O sinal óbvio para mim é que tudo é público.

O outro sinal são as violações da Lei de Deméter - referências excessivas a this.SomeObj.SomeProp.SomeProp em interfaces não fluentes.

Certa vez, vi o que chamei de "classe puppetmaster" que construiu um formulário de entrada de dados on-the-fly. Havia várias outras violações de design de software, pelo que o acoplamento excessivo era a menor das suas preocupações.

Ao recuperar dados dos controles que criou, fez o seguinte:

var control = activeDataEntryControl as CustomTextBox;
if (control != null)
   result = control.NestedTextBox.Text;

/* several other controls */
Austin Salonen
fonte
Uau. Você o criou e é nulo ??????
Michael K
Poderia ter sido um tipo diferente. Esse foi apenas um dos muitos em um loop.
Austin Salonen
5

O efeito cascata .

Toda mudança tem um efeito cascata em todos os módulos fortemente acoplados.

O princípio "Aberto-Fechado" foi violado por não estar devidamente fechado e a mudança vazar.

S.Lott
fonte
+1 para Ripple. Trabalhar com monstruosidades fortemente acopladas me faz querer alcançar o Ripple.
Adam Crossland
@ Adam Crossland: Eu não fiz o efeito Laphroaig funcionaria bem - muito caro. Mas o Efeito Thunderbird pode ter sido bom.
S.Lott 11/02
3

Verifique o número de # include / imports etc entre classes / packages / dlls / jars / whatnots. Tente desenhar um gráfico disso, mentalmente, manualmente ou usando algum tipo de ferramenta.

  • Se esse gráfico for denso (ou seja, muitas conexões em todo o lugar), seu sistema é monolítico e altamente acoplado.
  • Se estiver claramente dividido em camadas, sem conexões nas / através das camadas, e as conexões forem poucas, você terá um sistema modular e dissociado.
Macke
fonte
0

Se você acha impossível implementar um recurso porque não tem ideia de onde uma responsabilidade específica se aplica, seu sistema está muito acoplado.

Pete
fonte
0

Para sinais muito básicos, considere procurar o número de interfaces e seu uso entre classes de pacotes diferentes (o código geralmente fracamente acoplado contém interfaces e há uma interação direta limitada entre as classes individuais em pacotes diferentes), número de nomes de classes que podem ser usado para agrupar outras classes (no código fracamente acoplado, a interação real entre classes que têm tarefas diferentes é feita por funções de interface ou por funções de classes mais comuns / de agrupamento) ou numerar variáveis ​​públicas dentro de classes (variáveis ​​mais fracas, menores ou até mesmo inexistentes) )

Korhan
fonte
0

Praticamente todos os odores de código indicam acoplamento supérfluo de alguma maneira. Suponho que o cheiro que mais indica acoplamento possa ser "Intimidade Inadequada" (meu cheiro favorito).

Suponho que outro método razoável de medir seria contar as linhas no seu diagrama UML. Se você tiver N objetos e N ^ N (ou mais) linhas entre eles, seu código será praticamente o máximo possível. N linhas provavelmente seriam o mínimo possível.

Edward Strange
fonte