Cohesión y acoplamiento

By Fede

En la facultad cursé una asignatura llamada "Técnicas de Diseño". El equipo que llevaba la asignatura no era una gran autoridad en el tema del diseño de software, temática de la materia, y el responsable de la cátedra tenía muchos defectos, pero debo reconocer que era una persona sumamente convencida de sus ideas. Quizás más por amor propio que otra cosa. En cualquier caso, él estaba convencido de que la cohesión y el acoplamiento eran dos conceptos fundamentales en el diseño de soluciones informáticas. Y la verdad es que tiene toda la razón.

Voy a intentar definir cohesión y acoplamiento, desde el punto de vista informático. La cohesión es el grado de cercanía entre dos o más elementos. Podríamos decir que es un conjunto de características que los une y, por lo tanto, los agrupa bajo un mismo denominador, define su identidad. El acoplamiento, en cambio, mide el grado de dependencia entre dos o más elementos. Esto quiere decir que, según su dependencia, estarán más o menos acoplados. Mayor dependencia implica mayor acomplamiento.

El objetivo final del diseño de software (o soluciones informáticas) en materia de estos dos conceptos es: Reducir al máximo el acoplamiento entre componentes y aumentar la cohesión interna de cada componente.

¿Qué quiere decir reducir el acoplamiento? Básicamente, lo más importante es saber definir las responsabilidades de cada componente para garantizar que la dependencia sea funcional o arquitectónica, no de implementación. Un ejemplo simple de acoplamiento es cuando un componente accede directamente a un dato que pertenece a otro componente. ¿Qué ocurre en ese caso? Pues que el resultado del comportamiento del componente A dependerá del valor del componente B, por lo tanto, están acoplados. Cabe destacar que el acoplamiento no es malo, ojo. Simplemente hay que saber eliminar el acoplamiento que no sea funcional o arquitectónico. En el caso de acoplamiento funcional, está bien que un componente de cálculo de probabilidades dependa de un componente de cálculo matemático básico, ya que es evidente que para calcular probabilidades será necesario aplicar fórmulas matemátics y resolver operaciónes aritméticas. En el caso de acoplamiento arquitectónico, se puede ver un ejemplo en el esquema MVC (modelo-vista-controlador). La capa del modelo realizará cambios de acuerdo con los parámetros que recibe del controlador, por lo tanto hay cierta dependencia, pero sólo como separación de capas de una arquitectura claramente definida.

¿Qué ocurre en el caso de la cohesión? La cohesión de un componente mide la identidad de su comportamiento. El comportamiento de un componente se define mediante una serie de operaciones (contrato), cada una de ellas con una responsabilidad y función. La suma de todas las operaciones que definen dicho comportamiento integran una identidad. La cohesión no es buena cuando nos encontramos con que hay operaciones con un objetivo junto a otras con otro objetivo dentro de un mismo componente, cuya definición funcional es una y clara. Un ejemplo claro y sencillo de esto es el siguiente. Imaginemos un componente que gestiona el estado de una ficha de datos personales. Lo lógico sería que su contrato tuviese operaciones como "Actualizar nombres y apellidos", "Eliminar teléfono de contacto" y demás. Si defino una operación que calcula el pronóstico del tiempo en Tombuctú para el próximo fin de semana, pues la cohesión se anula completamente, ya que nada tiene que ver con el resto de operaciones y, sobretodo, con el fin del componente.

Con esto propongo un debate sobre estos dos conceptos, para enriquecernos entre todos y mejorar el uso que hacemos de ello a diario en nuestros diseños. Aunque no lo parezca, aplicamos estas ideas constantemente, en todos los niveles de un equipo de desarrollo de soluciones informáticas.

Un saludo para todos.

9 comentarios para “Cohesión y acoplamiento”

  1. luis Dice:

    deberias decir ademas que el acoplamiento y la cohesion son inversamente proporcionales. al tener bajo acomplamiento hay alta cohesion y viceversa.

  2. invitado Dice:

    Pero tambien podria darse el caso de colocar todo en una misma clas, donde tendriamos cero cohesion y cero acoplamiento. ESta claro que esto es una muy mala practica, pero podria darse el caso.

  3. Alberto Rodríguez Dice:

    Luís, hasta donde yo entiendo el acoplamiento y la cohesión no son inversamente proporcionales, sino que es una buena práctica tener bajo acoplamiento y alta cohesión.

    Aquí pongo un buen artículo sobre el tema:
    http://latecladeescape.com/w0/ingenieria-del-software/acoplamiento-y-cohesion.html

  4. javier Dice:

    Excelente artículo.

  5. mho Dice:

    gracias por el articulo!

  6. elo Dice:

    Hola
    Gracias por el articulo, es muy claro, si no me equivoco la cohesion tiene que ver tambien con los nombres de tus variables y metodos, es decir el nombre tiene que “describir” la funcion de la variable u objeto, saludos
    lo ideal “alta cohesion bajo acoplamiento”

  7. Kalay Dice:

    Muy bueno. La cohesion y el acoplamiento no veo porque son inversamente proporcionales. Yo puedo tener una clase que no dependa de ninguna (bajo acoplamiento) pero con muchas funciones diferentes y que no tienen nada que ver entre ellas (baja cohesión). O tambien al revés, una clase con funciones que sólo afecta a una tabla (alta cohesión), pero que coje los datos de muchas clases diferentes (alto acoplamiento). Al principio estas propiedades no parecen importantes, pero cuando has de hacer una modificación en el programa se nota la diferencia, ahora estoy modificando un programa con alto acoplamiento y es un infierno !

  8. Fede Dice:

    Gracias! Si la clase tiene baja cohesión, entonces hay un fallo de diseño. Una clase con muchos métodos que nada tienen que ver uno con otros denota una mezcla de responsabilidades de la clase. Suena más a cajón de sastre que a una clase con un objetivo y una responsabilidad claras. La metodología CRC es muy buena en ese sentido, nos hace ver con claridad la necesidad de definir la misión de cada clase en nuestro sistema. Por otro lado, el alto acoplamiento, como bien dices, es un auténtico infierno a la hora de hacer modificaciones…

  9. Sele Dice:

    Hola Fede,

    Gracias por tu artículo a mi tambien me parece muy claro, sin embargo me surge una duda con el acoplamiento, con los ejemplos de cohesion funcional y arquitéctonica me queda claro, pero puedes mencionar uno de implementación? un ejemplo claro porfavor

Escribe un comentario