Acoplamento é uma media de quão fortemente um elemento está conectado a, tem conhecimento de, ou depende de outros elementos. Um objeto com acoplamento baixo (ou fraco) não depende de muitos outros objetos.
O nível de acoplamento pode ser analisado de vários pontos, desde classes, pacotes e camadas à subsistemas e sistemas.
Problema: Como apoiar dependência baixa, baixo impacto de modificação e aumentar o reúso?
Solução: Atribuir responsabilidade de modo que o acoplamento permaneça baixo.
Abaixo segue alguns efeitos na arquitetura que uma classes com acoplamento alto (ou forte) pode causar:
- Rigidez: Alteração em uma classe, obriga a alteração em diversas classes relacionadas, gerando uma cadeia de manutenção, conhecidas como “efeito dominó”.
- Fragilidade: Dificuldade de manutenção em um determinado ponto do sistema, pois gera problemas em outro ponto não relacionado, conhecido como “efeito borboleta-maremoto”, nomenclatura extraída da Teoria do Caos. Esta teoria defende que o simples bater de asas de uma borboleta em um extremo do mundo, pode causar um tornado no outro extremo.
- Imobilidade: Dificuldade de reutilização por excesso de dependência entre
classes, conhecido como “efeito banana-gorila”, pois a dependência é tão grande que solicitar uma banana e é obtido um gorila junto com ela.
Formas comum de acoplamento entre classes:
- Objeto A tem um atributo do que se refere a instância de um objeto B.
- Objeto A chama um serviço de um objeto B.
- Objeto A tem um método que referencia uma instância de um objeto B (seja por parâmetro, variável local ou retorno da mensagem).
- Objeto A é uma subclasse do objeto B.
- Objeto B é uma interface implementada pelo objeto A.
Dica: O nível de acoplamento em si não deve ser considerado isolado de outros princípios tais como Especialista de Informação e Coesão Alta.
Contra-Indicações
Acoplamento forte a objetos estáveis não é um problema. Exemplo: Pode-se acoplar com segurança a biblioteca Java (java.util, etc) ou .Net (System.Collections, etc) pois são estáveis e amplamente disseminadas.
O acoplamento alto não é um problema, mas passa a ser um problema em classes que estão sujeitas a modificações ou entre objetos de pacotes e/ou camadas diferentes. A idéia principal é minimizar os efeitos de dependência excessivo entre objetos a fim de reduzir os impactos de modificações e permitir o reuso de objetos.
Devemos sempre avaliar o grau de acoplamento entre objetos e quais as conseqüências teremos em nosso sistema ao aumenta-lo.
Objetos genéricos devem sempre ter um nível de acoplamento muito baixo possibilitar reutiliza-lo em diversas partes do sistemas sem grandes impactos de dependência.
Por outro lado, objetos com ausência de acoplamento também não são bem vistos no sistema, pois contradiz a metáfora central da tecnologia de objetos: “um sistema é composto por objetos conectados que se comunicam por mensagens”.
Vantagens:
- Não é afetado por mudanças em outros computadores.
- Simples de entender isoladamente.
- É conveniente para reutilização.
Padrões Relacionados
- Variação Protegida
Enjoy
