Você menciona os padrões de design e o acoplamento. Estes são conceitos separados, por isso vou lidar com eles separadamente. A única conexão real é que os padrões de design tendem a promover acoplamentos frouxos (já que esse é um aspecto importante do bom design).
Padrões de design
O conceito de Design Patterns é bastante simples: eles são apenas um conjunto de modelos de como lidar com vários problemas comuns. Existem 2 razões principais pelas quais eles são populares:
- Eles são 'comprovados': já foram usados muitas vezes e os benefícios / desvantagens de cada um são geralmente conhecidos, em particular quaisquer problemas sutis que possam causar grandes problemas são conhecidos.
- Eles fornecem um conjunto comum de terminologia e, portanto, facilitam a comunicação. Se alguém disser que "a classe X desempenha o papel de observador no padrão de observador", os desenvolvedores familiarizados com o padrão poderão entender imediatamente o que está acontecendo.
Como você sabe que o implementou corretamente? Essa é complicada. Para a maioria dos padrões, é simples - você grocou ou não. Alguns padrões são menos claramente definidos que outros - por exemplo, model-view-controller . Padrões como esse são melhor usados como diretrizes gerais. As especificidades de como você o implementa são menos importantes do que entender as razões pelas quais o padrão existe e o que ele pretende realizar.
Os padrões de design não são "o único caminho verdadeiro". Frequentemente, você precisará adaptá-los para seus propósitos específicos ou, às vezes, não haverá padrões que atendam aos requisitos. Forçar um padrão de design onde ele não se encaixa é uma má idéia; é como usar um martelo muito bom quando o que você realmente quer é uma chave de fenda.
Acoplamento
Esta é uma ideia realmente importante em ciência da computação. Como os requisitos para a maioria dos projetos de software mudam com o tempo (às vezes significativamente), é importante a capacidade de um design para lidar com as mudanças. O acoplamento é basicamente a medida de "quão difícil seria trocar esse componente por outro?" O 'componente' pode ser um método, classe, pacote, biblioteca etc.
Existem vários tipos de acoplamento listados neste artigo da Wikipedia .