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 ConnectionPool
con los siguientes requisitos. Tenga en cuenta que puede parecer demasiado para una clase simple como, ConnectionPool
pero 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 ConnectionPool
clase 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 ConnectionPool
diagrama de alta cohesión anterior. Si miramos el diagrama anterior aunque admite una alta cohesión, ConnectionPool
está estrechamente unido a la ConnectionStatistics
clase e PersistentStore
interactúa con ellos directamente. En lugar de reducir el acoplamiento, podríamos introducir una ConnectionListener
interfaz y dejar que estas dos clases implementen la interfaz y que se registren con la ConnectionPool
clase. Y ConnectionPool
iterará 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 Facade
que interactúe con estos servicios múltiples internamente y cualquier cambio en los servicios se vuelva local Facade
y obligue a un bajo acoplamiento con el tercero servicios.