Cohesión

En el artículo anterior estuvimos viendo un poco por encima en qué consisten los conceptos de acoplamiento y cohesión. En esta segunda parte nos centraremos es ver los distintos tipos de cohesión que hay. Eso sí, dependiendo del autor o autora, puede variar la lista, así que he intentado unificar lo máximo posible para poner los tipos que hay en común.

Tipos de cohesión.

NombreDescripción
⬆ AltaCohesión funcionalLos elementos de un módulo realizan una tarea única y específica.
Cohesión secuencialLos elementos de un módulo están conectados en una secuencia lógica.
Cohesión comunicativaLos elementos de un módulo están relacionados porque trabajan juntos para producir un resultado común.
Cohesión temporalLos elementos de un módulo están relacionados en el tiempo.
Cohesión lógicaLos elementos de un módulo están relacionados porque todos contribuyen a un resultado lógico común.
⬇ BajaCohesión de coincidenciaLos elementos de un módulo están relacionados porque todos están asociados con un evento o entidad común.

Cohesión de coincidencia.

Los elementos de un módulo están relacionados porque todos están asociados con un evento o elemento común.

Para explicar esto de una manera más práctica, consideremos un ejemplo. Imagina que tienes un módulo que se encarga de la validación de formularios. Este módulo contiene varias funciones, como validateEmail(), validatePassword(), validateName(), etc. Estas funciones comparten algunas constantes o variables globales, como las expresiones regulares para verificar el formato de entrada.

En este caso, podríamos decir que el módulo tiene una cohesión de coincidencia, ya que las funciones no están conectadas entre sí, pero comparten algunos recursos. En lugar de esto, podríamos dividir el módulo en submódulos más pequeños y específicos, como uno para validar correos electrónicos, otro para contraseñas, etc. De esta manera, cada módulo tendría una mayor cohesión, lo que facilitaría su mantenimiento y escalabilidad.

Es importante tener en cuenta que la cohesión de coincidencia no siempre es mala. De hecho, en algunos casos, puede ser difícil evitarla por completo. Sin embargo, es importante asegurarse de que la cohesión de coincidencia no se convierta en un problema en el futuro.

Cohesión lógica

La cohesión lógica implica que un conjunto de componentes que pueden trabajar para conseguir un fin deberían estar juntos, mientras que los que no tienen ninguna relación directa con ese fin deberían estar separados.

Este tipo de cohesión, generalmente, resulta en un código compartido, que es difícil de modificar y que implica estar pasando parámetros entre módulos que en ocasiones pueden ser innecesarios.

Si pensamos en el típico y tópico caso de una tienda online. Podríamos tener varios módulos que se relacionan entre sí, como el módulo de autenticación, el módulo de gestión de productos, y el módulo de gestión de pedidos. Cada uno de estos módulos tendría su propia funcionalidad, pero estarían lógicamente conectados entre sí. Cuando un usuario inicia sesión, el módulo de autenticación se encargaría de autenticar al usuario y el módulo de gestión de productos mostraría los productos disponibles en la tienda. El problema aparecerá si los módulos están muy entrelazados y se cambia el funcionamiento o el comportamiento, mejor dicho de alguno de ellos, ya que implicará que se adapte el resto de módulos.

Si cada módulo es verdaderamente independiente, entonces podemos hacer cambios en uno, y no debería implicar la modificación del resto.

Cohesión temporal

La cohesión temporal es parecida a la lógica pero, como su nombre indica, en este caso los distintos módulos tienen relación en el tiempo.

Un ejemplo muy claro se da cuando tenemos una parte en nuestro código que se encarga de inicializar la aplicación. En ese momento estaremos uniendo distintos módulos que sólo tienen tienen en común el actuar dentro de esa funcionalidad.

Este tipo de cohesión tiende a presentar las desventajas de los módulos con cohesión lógica. Sin embargo, se considera una cohesión más fuerte, ya que los módulos tienden a ser más simples puesto que todos los elementos se ejecutan en un solo momento (es decir, normalmente no hay parámetros y lógica para determinar qué elemento ejecutar).

Cohesión comunicativa

En este tipo de cohesión, los elementos operan sobre los mismos datos o sobre un subconjunto de ellos.

Por ejemplo, el elemento que gestiona el estado de conexión de un usuario o usuaria en un sistema de mensajería, y el que muestra el estado de los contactos. Operan sobre el mismo dato (estado de conexión), pero son elementos distintos.

Cohesión secuencial

Se da cuando la salida de un elemento es la entrada del siguiente.

Un ejemplo de cohesión secuencial se puede dar cuando llega una llamada a una API para almacenar un dato. Se van pasando por distintas capas que convierten por ejemplo un JSON a un objeto, para terminar llegando a la persistencia. En este ejemplo, cuando termina un elemento de hacer su trabajo, el resultado es enviado al elemento siguiente en la cadena.

Cohesión funcional

En un módulo cohesionado funcionalmente, todos los elementos están relacionados para llevar a cabo una sola función, siendo lo suficientemente pequeños.

Pensemos en una aplicación de procesamiento de imágenes. En este caso, podríamos tener diferentes módulos para la captura de imágenes, la edición de imágenes y la exportación de imágenes. Cada uno de estos módulos tiene una función específica, pero están conectados para permitir una edición y exportación efectiva de las imágenes.

Si estos módulos no estuvieran funcionalmente conectados, podría ser difícil mantener y escalar el código. Por ejemplo, si el módulo de edición de imágenes no estuviera diseñado para trabajar de manera efectiva con el módulo de exportación de imágenes, las imágenes podrían no exportarse correctamente.

En este tipo de acoplamiento cada módulo es lo suficientemente pequeño como para que se pueda comprender toda su implementación de una sola vez. En el momento en que empezamos a añadir distintos caminos y flujos, el módulo seguramente se pueda hacer aún más pequeño.

¿Cómo detectar el tipo de cohesión?

Una técnica útil para determinar el tipo de cohesión de un módulo consiste en escribir una oración que describa el propósito del módulo y luego examinar la oración. Se pueden realizar las siguientes pruebas:

  1. Si la oración es compuesta, contiene una coma o más de un verbo, el módulo probablemente está realizando más de una función; de modo que, probablemente, tiene cohesión secuencial o comunicativa.
  2. Si la oración contiene palabras relacionadas con el tiempo, como "primero", "siguiente", "entonces", "después", "cuando", "comenzar", etc., entonces el módulo probablemente tiene cohesión secuencial o temporal.
  3. Si el predicado de la oración no contiene un objeto específico que siga al verbo, es probable que el módulo tenga cohesión lógica. Por ejemplo, "Editar Todos los Datos" tiene un cohesión lógica; sin embargo, "Editar la Declaración de Origen" puede tener cohesión funcional.
  4. Palabras como "inicializar", "limpiar", etc. implican cohesión temporal.
Comparte este artículo con quien quieras
Hablemos de acoplamiento y cohesión. Parte 1
Aritmética binaria

Leave a Comment

Your email address will not be published. Required fields are marked *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.