La alta cohesión dentro de los módulos y el bajo acoplamiento entre los módulos a menudo se consideran relacionados con la alta calidad en los lenguajes de programación OO.
Por ejemplo, el código dentro de cada clase Java debe tener una alta cohesión interna, pero debe estar lo más unida posible al código en otras clases de Java.
El acoplamiento se refiere a cómo se relacionan dos clases/módulos y qué tan dependientes son el uno del otro. Ser de bajo nivel de acoplamiento significaría que cambiar algo importante en una clase no debería afectar al otro. El acoplamiento alto dificultaría la realización de cambios en el código y su mantenimiento, ya que las clases están muy juntas, por lo que un cambio podría significar la renovación de todo un sistema.
Cohesión se refiere a lo que hará la clase (o módulo). La baja cohesión significaría que la clase realiza una gran variedad de acciones y no se centra en lo que debería hacer. Una alta cohesión significaría que la clase se centra en lo que debería estar haciendo, es decir, solo en los métodos relacionados con la intención de la clase.
Todo buen diseño de software será de alta cohesión y bajo acoplamiento.
Una distinción que se me escapó al principio: 'coupling' es * entre * clases, mientras que' cohesión' es * dentro de * una sola clase. –