Acoplamento vs Coesão
Acoplamento e coesão são dois conceitos encontrados em Java (e todas as outras linguagens orientadas a objetos). O acoplamento mede o quanto cada um dos módulos do programa é dependente dos outros módulos do programa. A coesão mede quão fortemente cada uma das funções está relacionada dentro de um módulo. Na verdade, qualquer linguagem orientada a objetos (incluindo Java) tem os dois objetivos principais de aumentar a coesão e diminuir o acoplamento ao mesmo tempo, a fim de desenvolver programas mais eficientes. Essas duas métricas de engenharia de software foram desenvolvidas por Larry Constantine para reduzir o custo de modificação e manutenção de software.
O que é Coesão?
Coesão mede quão fortemente cada uma das funções está relacionada dentro de um módulo de programa. Aulas bem estruturadas levam a programas altamente coesos. Se uma determinada classe está executando um conjunto de funções altamente relacionadas, essa classe é considerada coesa. Por outro lado, se uma classe está executando um monte de funcionalidades totalmente não relacionadas, isso significa que a classe não é coesa. É importante entender que não ter coesão não significa que o aplicativo geral não tenha a funcionalidade necessária. Só que sem coesão, será muito difícil gerenciar as funcionalidades porque elas ficarão espalhadas em muitos lugares errados à medida que a complexidade da aplicação aumenta com o tempo. Manter, modificar e estender comportamentos espalhados por todo o código é muito tedioso, mesmo para os programadores mais experientes.
O que é Acoplamento?
Coupling mede o quanto cada um dos módulos do programa é dependente dos outros módulos do programa. As interações entre dois objetos ocorrem porque há acoplamento. Programas fracamente acoplados são altamente flexíveis e extensíveis. O acoplamento forte nunca é bom porque um objeto pode ser altamente dependente de outro objeto. Isso é um pesadelo quando o código é modificado, porque alto acoplamento significa que os programadores precisam trabalhar em vários locais de código até mesmo para uma única modificação comportamental. O acoplamento forte sempre leva a programas com baixa flexibilidade e menos escalabilidade/extensibilidade. No entanto, em linguagens de programação como Java, evitar completamente o acoplamento é impossível. Mas é recomendado que os programadores façam o seu melhor esforço para reduzir o acoplamento o máximo possível. Também é possível ter algum acoplamento para ajudar os objetos a interagirem entre si sem prejudicar sua escalabilidade e flexibilidade.
Qual é a diferença entre Acoplamento e Coesão?
Ainda que acoplamento e coesão lidem com a qualidade de um módulo em engenharia de software, são conceitos totalmente diferentes. A coesão fala sobre o quanto as funcionalidades estão relacionadas entre si dentro do módulo, enquanto o acoplamento lida com o quanto um módulo é dependente dos outros módulos do programa dentro de toda a aplicação. Para ter um software de melhor qualidade, coesão e acoplamento devem atingir as duas extremidades opostas de seus espectros. Em outras palavras, baixo acoplamento e forte coesão fornecem o melhor software. Ter campos privados, classes não públicas e métodos privados fornece acoplamento flexível, enquanto torna todos os membros visíveis dentro da classe e ter package como visibilidade padrão fornece alta coesão.