Acoplamento: Acoplamento é quanto um elemento (classe, método, função, módulo, componente... basicamente qualquer coisa) depende e conhece do outro. Um exemplo seria: o nível de interligação entre duas classes(no caso de java), ou seja, o quanto uma classe conhece da outra. Elementos muito acoplados geralmente são muito dependentes, mudou um e você com certeza vai ter que mudar o outro. O acoplamento é proporcionalmente ligado a dor decabeça que vc terá caso mude a implementação de uma classe.
Coesão: é o quanto as tarefas que um elemento realiza estão relacionadas com um mesmo conceito. Baixa coesão teria uma classe que, por exemplo, imprime um documento e exibe um formulário para o usuário, neste caso provavelmente você deveria dividir esta classe em mais de uma. Representa o quão uma classe é específica para desempenhar um papel em um contexto.
A idéia eh sempre ter o máximo de coesão e o mínimo de acoplamento. Lembrando sempre que não ter acoplamento é impossível, pois a classe precisam de alguma forma se comunicarem.
Por JORGE MOREIRA:
Grau de interdependência entre dois módulos (Melhor para o pior):
1 - Acoplamento de dados: troca de parâmetros (o melhor): quando módulos ou classes compartilham dados via parâmetros. Cada parâmetro é uma parte elementar, send esta o unico dado compartilhado entre módulos ou classes (Ex. passando um inteiro para uma função que calcula aus raiz quadrada
2 - Acoplamento de imagem (estrutura de dados comum utilizada parcialmente em vários módulos)
3 - Acoplamento de controle - exemplo: flags indicando o que um módulo deve fazer (intermediário), quando um módulo ou classe controla a lógica de outro, passando informações de que operações executar.
4 - Acoplamento comum (módulos acessam área de dados comum): quando dois módulos ou classes compartilham os meswmos dados globais (Ex. uma variável global). Mudanças nos recursos compiartilhados implicará mudanças em todos os módulos que os utilizam.
5 - Acoplamento de conteúdo: se um módulo faz referência ao interior do outro (o pior): Quando um módulo ou classe altera ou depende de uma funcionalidade interna de outro módulo (Ex. acessando dados locais de um módulo). Uma alteração no modulo de serviço acarretará alterações no módulo dependente.
Coesão, intensidade da associação entre 2 módulos (Melhor para o pior):
1 - Funcional (caixa preta, a melhor) – uma e somente uma função identificável.
2 - Seqüencial (várias atividades – que precisam ser - executadas em seqüência, e os dados fluem de uma atividade para outra)
3 - Comunicacional (atividades usam a mesma entrada e a mesma saída)
4 - Procedural (atividades diferentes, com controle – e não dados - fluindo de uma para outra)
5 - Temporal (várias funções executadas no mesmo tempo. Ex: inicialização)
6 - Lógica (várias funções semelhantes porém independentes)
7 - Coincidental (a pior)