Função(Acoplamento e Coesão)

Pessoal eu estava estudando POO, e apareceram estes dois tópicos. Eles são semelhantes em função? Tipo, Coesão fala em designer de classe e acoplamento tambem. E outra, estes dois falam em graus de entendimento de classe! Então, eu entendi assim:

Uma classe perfeita tem que ter uma alta Coesão e um baixo acoplamento. Isto tá correto? Senão tiver, qual é a função delas?
Obrigado!

Coesão reference à capacidade da classe ou função fazer o seu trabalho.
É um parametro complexo, mas quanto maior melhor. Representa o quanto eu tenho que mexer na classe para entender um bug , descobirr um erro ou colocar mais funcionalidades. Coesão = eficiencia + simplicidade. Por isso, maior é melhor.
Acoplamento reference à dependencia que a classe tem de outras classes.
Quanto mais a classe depender das funções de outras classe, pior. Por isso , quanto menor, melhor. Acoplamente relaciona-se o quanto eu tenho que mudar noutras classes que usam esta classe se eu musar esta classe. O uso de interfaces e fabricas (chamado tb de inversão de dependencia)diminui o acomplamento.

Acoplar reference-se a quão boa a classe é na relação com outras, coesão reference a quão boa ela é por si mesma.
Alta coesão significa que a classe é eficiente, é simples de usar , entender e manter. Sobretudo manter. Baixo acoplamento significa que a classe conhece o minimo necessário das outras classes que usa.

Coesão é a capacidade de uma classe em cumprir seu papel. Se você cria uma classe bicicleta, ela deverá possuir todos os métodos e variáveis pertinentes à uma bicicleta, nem mais, nem menos. O que aconteceria se um método de roda ficasse na classe bicicleta? Código mais complicado e mais difícil de se entender.

Acoplamento é a dependência de uma classe com outra. Quanto mais dependente for uma classe de uma outra classe especifica, mais dificil fica a manutenção do código, pois uma alteração nesta última significa em mudanças também na sua dependente. Imagine que você irá utilizar uma estrutura de dados do tipo lista e resolva usar a ArrayList. Você conhece as limitações da ArrayList, limitações não expostas na interface pública dessa classe, logo realiza alguns truques pra contorná-las. Meses mais tarde, você recebe uma nota do cara do QA que seria bom utilizar a LinkedList… E agora? Mudança em todos os códigos… O ideal teria sido utilizar desde o início a interface List, mesmo senão houvesse a mudança, pois ela iria (1) limitar a quantidade de métodos disponíveis e (2) definir apenas o papel da classe que ali estaria, uma Collection do tipo List. Exatamente qual, não interressa, pois seu código apenas precisava disto em primeiro lugar.

Waocnek