En programación informática , la cohesión se refiere al grado en el que los elementos dentro de un módulo pertenecen juntos . [1] En un sentido, es una medida de la fuerza de la relación entre los métodos y los datos de una clase y algún propósito o concepto unificador servido por esa clase. En otro sentido, es una medida de la fuerza de la relación entre los métodos y los datos de la clase.
La cohesión es un tipo ordinal de medida y suele describirse como “alta cohesión” o “baja cohesión”. Los módulos con alta cohesión tienden a ser preferibles, porque la alta cohesión se asocia con varias características deseables del software, entre ellas la robustez , la confiabilidad, la reutilización y la comprensibilidad. Por el contrario, la baja cohesión se asocia con características indeseables, como la dificultad de mantenimiento, prueba, reutilización o comprensión.
La cohesión se contrasta a menudo con el acoplamiento . Una alta cohesión a menudo se correlaciona con un acoplamiento débil , y viceversa. [2] Las métricas de software de acoplamiento y cohesión fueron inventadas por Larry Constantine a fines de la década de 1960 como parte del diseño estructurado , basándose en características de prácticas de programación "buenas" que reducían los costos de mantenimiento y modificación. El diseño estructurado, la cohesión y el acoplamiento se publicaron en el artículo Stevens, Myers & Constantine (1974) [3] y el libro Yourdon & Constantine (1979). [1] Los dos últimos posteriormente se convirtieron en términos estándar en ingeniería de software .
En la programación orientada a objetos , se dice que una clase tiene alta cohesión si los métodos que la sirven son similares en muchos aspectos. [4] En un sistema altamente cohesivo, la legibilidad y reutilización del código aumentan, mientras que la complejidad se mantiene manejable.
La cohesión aumenta si:
Las ventajas de una alta cohesión (o "cohesión fuerte") son:
Si bien en principio un módulo puede tener una cohesión perfecta al constar únicamente de un único elemento atómico (que tenga una única función, por ejemplo), en la práctica las tareas complejas no se pueden expresar mediante un único elemento simple. Por lo tanto, un módulo de un solo elemento tiene un elemento que es demasiado complicado para realizar una tarea o demasiado estrecho y, por lo tanto, está estrechamente acoplado a otros módulos. De este modo, la cohesión se equilibra con la complejidad de la unidad y el acoplamiento.
La cohesión es una medida cualitativa, lo que significa que el código fuente se examina utilizando una rúbrica para determinar una clasificación. Los tipos de cohesión, desde el peor hasta el mejor, son los siguientes:
/* Grupos: Las definiciones de funciones Partes: Los términos de cada función */ Módulo A { /* Implementación de r(x) = 5x + 3 No hay ninguna razón particular para agrupar funciones de esta manera, por lo que se dice que el módulo tiene cohesión coincidente. */ r ( x ) = a ( x ) + b ( x ) a ( x ) = 2 x + 1 b ( x ) = 3 x + 2 }
/* Grupos: Las definiciones de funciones Partes: Los términos de cada función */ Módulo A { /* Implementación de operaciones aritméticas Se dice que este módulo tiene cohesión funcional porque existe la intención de agrupar operaciones aritméticas simples en él. */ a ( x , y ) = x + y b ( x , y ) = x * y } Módulo B { /* Módulo B: Implementa r(x) = 5x + 3 Se puede decir que este módulo tiene cohesión atómica. También se puede decir que todo el sistema (con los módulos A y B como partes) tiene cohesión funcional, porque sus partes tienen propósitos específicos separados. */ r ( x ) = [ Módulo A ]. a ([ Módulo A ]. b ( 5 , x ), 3 ) }
/* Grupos: Las definiciones de funciones Partes: Los términos de cada función */ Módulo A { /* Implementación de r(x) = 2x + 1 + 3x + 2 Se dice que tiene cohesión perfecta porque no se puede reducir más que eso. */ r ( x ) = 2 x + 1 + 3 x + 2 }
Aunque la cohesión es un tipo de escala de clasificación, las clasificaciones no indican una progresión constante de la mejora de la cohesión. Los estudios de Larry Constantine , Edward Yourdon y Steve McConnell [5] indican que los dos primeros tipos de cohesión son inferiores, la cohesión comunicacional y secuencial son muy buenas y la cohesión funcional es superior.