Coesão refere-se ao grau em que uma classe tem uma responsabilidade única e bem definida.
Ou seja, o grau em que os elementos (atributos e comportamentos) de uma classe estão relacionados e trabalham juntos para atingir um objetivo comum.
Quanto maior a coesão, mais forte é a relação entre os elementos da classe e mais focado é o objetivo, ou a responsabilidade, da classe.
Uma classe com alta coesão é mais fácil de entender, manter e modificar, porque suas partes são altamente interdependentes e fazem sentido juntas.
Acoplamento refere-se ao grau de comunicação de uma classe com outras classes, ou seja, o quanto uma classe depende da outra.
Quanto maior o acoplamento de uma classe, mais forte é a dependência entre os objetos dela com os objetos de outras classes, e mais difícil é modificá-los sem afetar o código de outras classes.
Um baixo acoplamento é desejável, pois permite que os objetos sejam modificados de forma independente e facilita a manutenção e a reutilização de código.
Em Orientação a Objetos, a organização e estruturação das classes de um sistema e das relações entre as classes é chamada de Arquitetura do Sistema.
Para ter uma arquitetura de um sistema orientado a objetos de qualidade, busca-se projetar sistemas que possuam alta coesão e baixo acoplamento.
ALTA coesão
BAIXO acoplamento
Alta coesão e baixo acoplamento. Fonte: Autoral, feito com Canva para Educação.
Nos exemplos do projeto Triangulo da página Classes e Objetos em Java , há duas soluções:
Podemos fazer uma analogia entre coesão e acoplamento na programação e os cargos e responsabilidades em uma empresa.
A coesão pode ser comparada à definição clara e específica das responsabilidades de cada cargo em uma empresa. Cada cargo tem uma função bem definida e trabalha em conjunto com outros cargos para atingir um objetivo comum. Quanto mais clara e específica a definição das responsabilidades, maior será a coesão entre os cargos e mais fácil será para a empresa atingir seus objetivos. Assim como em uma classe bem coeso, em uma empresa com cargos bem definidos é mais fácil entender, manter e modificar as responsabilidades de cada cargo.
Já o acoplamento pode ser comparado à interdependência entre os cargos em uma empresa. Cada cargo depende do trabalho de outros cargos para atingir seus objetivos, mas deve ser capaz de realizar suas responsabilidades de forma independente. Quando os cargos estão altamente acoplados, significa que eles são altamente dependentes uns dos outros e uma mudança em um cargo pode afetar significativamente o trabalho dos outros cargos. Assim como em uma classe com alto acoplamento, em uma empresa com cargos altamente acoplados, uma mudança em um cargo pode causar um efeito cascata que afeta outros cargos.
Fonte: Lexica, feita com Stable Diffusion.
Portanto, é importante que os cargos em uma empresa tenham uma alta coesão e um baixo acoplamento, assim como classes bem projetadas em programação OO. Isso significa que cada cargo deve ter responsabilidades bem definidas e trabalhar em conjunto com outros cargos para atingir um objetivo comum, mas também ser capaz de realizar suas responsabilidades de forma independente. Isso promove a eficiência e a flexibilidade da empresa, permitindo que ela se adapte às mudanças de mercado e atinja seus objetivos de forma eficaz.
Mas, como alcançar o equilíbrio entre estas duas propriedades em meio ao paradoxo?
Utilizando conceitos e técnicas de arquitetura OO, tais como: princípios OO, padrões de projeto, abordagens de desenvolvimento como a BDD (Behaviour Driven Development, em português Desenvolvimento Dirigido por Comportamento) e TDD (Test Driven Development, em português Desenvolvimento Orientado a Testes), técnicas de refatoração etc.
Ao longo do curso, será possível aprender alguns destes conceitos e técnicas.