La cohesión es una indicación de cuán relacionadas y enfocadas están las responsabilidades de un elemento de software.
El acoplamiento se refiere a la fuerza con la que un elemento de software está conectado a otros elementos.
El elemento de software podría ser clase, paquete, componente, subsistema o un sistema. Y al diseñar los sistemas, se recomienda tener elementos de software que tengan alta cohesión y soporte de bajo acoplamiento .
La baja cohesión da como resultado clases monolíticas que son difíciles de mantener, comprender y reduce la reutilización. Del mismo modo, el acoplamiento alto da como resultado clases que están estrechamente acopladas y los cambios no suelen ser no locales, difíciles de cambiar y reducen la reutilización.
Podemos tomar un escenario hipotético en el que estamos diseñando un monitor típico ConnectionPoolcon los siguientes requisitos. Tenga en cuenta que puede parecer demasiado para una clase simple como, ConnectionPoolpero la intención básica es demostrar un bajo acoplamiento y una alta cohesión con algún ejemplo simple y creo que debería ayudar.
- apoyo para obtener una conexión
- liberar una conexión
- obtener estadísticas sobre el recuento de conexión vs uso
- obtener estadísticas sobre conexión vs tiempo
- Almacene la información de recuperación y liberación de la conexión en una base de datos para informar más adelante.
Con poca cohesión , podríamos diseñar una ConnectionPoolclase al forzar toda esta funcionalidad / responsabilidades en una sola clase como se muestra a continuación. Podemos ver que esta clase única es responsable de la administración de la conexión, interactuando con la base de datos y manteniendo las estadísticas de conexión.

Con alta cohesión podemos asignar esta responsabilidad en todas las clases y hacerla más sostenible y reutilizable.

Para demostrar el acoplamiento bajo , continuaremos con el ConnectionPooldiagrama de alta cohesión anterior. Si miramos el diagrama anterior aunque admite una alta cohesión, ConnectionPoolestá estrechamente unido a la ConnectionStatisticsclase e PersistentStoreinteractúa con ellos directamente. En lugar de reducir el acoplamiento, podríamos introducir una ConnectionListenerinterfaz y dejar que estas dos clases implementen la interfaz y que se registren con la ConnectionPoolclase. Y ConnectionPooliterará a través de estos oyentes y les notificará sobre los eventos de conexión y descarga y permite un menor acoplamiento.

Nota / palabra o precaución: para este escenario simple puede parecer una exageración, pero si imaginamos un escenario en tiempo real donde nuestra aplicación necesita interactuar con múltiples servicios de terceros para completar una transacción: Acoplando directamente nuestro código con los servicios de terceros significaría que cualquier cambio en el servicio de terceros podría dar lugar a cambios en nuestro código en varios lugares, en su lugar podríamos tener Facadeque interactúe con estos servicios múltiples internamente y cualquier cambio en los servicios se vuelva local Facadey obligue a un bajo acoplamiento con el tercero servicios.