En programación de computadoras , la cohesión se refiere al grado en que los elementos dentro de un módulo pertenecen juntos . [1] En cierto sentido, es una medida de la fuerza de la relación entre los métodos y 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 de la clase y los datos mismos.
La cohesión es un tipo de medición ordinal y generalmente se describe como "alta cohesión" o "baja cohesión". Los módulos con alta cohesión tienden a ser preferibles, porque la alta cohesión está asociada con varios rasgos deseables del software, que incluyen robustez , confiabilidad, reutilización y comprensibilidad. Por el contrario, la cohesión baja se asocia con rasgos indeseables como ser difícil de mantener, probar, reutilizar o incluso comprender.
La cohesión a menudo se contrasta con el acoplamiento , un concepto diferente. La alta cohesión a menudo se correlaciona con un acoplamiento flojo 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 "buenas" prácticas de programación que redujeron los costos de mantenimiento y modificación. Diseño estructurado, cohesión y acoplamiento fueron publicados en el artículo Stevens, Myers & Constantine (1974) [3] y el libro Yourdon & Constantine (1979); [1] los dos últimos se convirtieron posteriormente en términos estándar en ingeniería de software.
Alta cohesión
En la programación orientada a objetos , si los métodos que sirven a una clase tienden a ser similares en muchos aspectos, se dice que la clase tiene una alta cohesión. [4] En un sistema altamente cohesivo, aumenta la legibilidad y reutilización del código , mientras que la complejidad se mantiene manejable.

La cohesión aumenta si:
- Las funcionalidades integradas en una clase, a las que se accede a través de sus métodos, tienen mucho en común.
- Los métodos llevan a cabo una pequeña cantidad de actividades relacionadas, evitando conjuntos de datos de grano grueso o no relacionados.
- Los métodos relacionados están en el mismo archivo fuente o agrupados de otra manera; por ejemplo, en archivos separados pero en el mismo subdirectorio / carpeta.
Las ventajas de una alta cohesión (o "fuerte cohesión") son:
- Reducción de la complejidad del módulo (son más simples, tienen menos operaciones).
- Mayor capacidad de mantenimiento del sistema , porque los cambios lógicos en el dominio afectan a menos módulos y porque los cambios en un módulo requieren menos cambios en otros módulos.
- Mayor reutilización del módulo, porque los desarrolladores de aplicaciones encontrarán el componente que necesitan más fácilmente entre el conjunto cohesivo de operaciones proporcionado por el módulo.
Si bien, en principio, un módulo puede tener una cohesión perfecta si solo consta de un único elemento atómico (que tiene una única función, por ejemplo), en la práctica, las tareas complejas no se pueden expresar con un solo elemento simple. Por lo tanto, un módulo de un solo elemento tiene un elemento que es demasiado complicado, para realizar una tarea, o es demasiado estrecho y, por lo tanto, está estrechamente acoplado a otros módulos. Por tanto, la cohesión se equilibra con la complejidad y el acoplamiento de la unidad.
Tipos de cohesión
La cohesión es una medida cualitativa, lo que significa que el código fuente que se va a medir se examina mediante una rúbrica para determinar una clasificación. Los tipos de cohesión, del peor al mejor, son los siguientes:
- Cohesión coincidente (peor)
- La cohesión coincidente se da cuando las partes de un módulo se agrupan arbitrariamente; la única relación entre las partes es que se han agrupado (por ejemplo, una clase de "Utilidades"). Ejemplo:
/ * 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 en 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 }
- Cohesión lógica
- La cohesión lógica se da cuando las partes de un módulo se agrupan porque están categorizadas lógicamente para hacer lo mismo aunque sean diferentes por naturaleza (por ejemplo, agrupar todas las rutinas de manejo de entrada de teclado y mouse).
- Cohesión temporal
- La cohesión temporal es cuando las partes de un módulo se agrupan según el momento en que se procesan: las partes se procesan en un momento particular en la ejecución del programa (por ejemplo, una función que se llama después de detectar una excepción que cierra archivos abiertos, crea un registro de errores y notifica al usuario).
- Cohesión procesal
- La cohesión de procedimientos se da cuando las partes de un módulo se agrupan porque siempre siguen una determinada secuencia de ejecución (por ejemplo, una función que verifica los permisos del archivo y luego abre el archivo).
- Cohesión comunicacional / informacional
- La cohesión comunicacional se da cuando las partes de un módulo se agrupan porque operan sobre los mismos datos (por ejemplo, un módulo que opera sobre el mismo registro de información).
- Cohesión secuencial
- La cohesión secuencial es cuando las partes de un módulo se agrupan porque la salida de una parte es la entrada a otra parte como una línea de ensamblaje (por ejemplo, una función que lee datos de un archivo y procesa los datos).
- Cohesión funcional (mejor)
- La cohesión funcional se da cuando las partes de un módulo se agrupan porque todas contribuyen a una sola tarea bien definida del módulo (por ejemplo, análisis léxico de una cadena XML). Ejemplo:
/ * 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 separados específicos. * / r ( x ) = [ Módulo A ]. a ([ Módulo A ]. b ( 5 , x ), 3 ) }
- Cohesión perfecta (atómica)
- Ejemplo.
/ * 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 una cohesión perfecta porque no se puede reducir más que eso . * / r ( x ) = 5 x + 3 }
Aunque la cohesión es un tipo de escala de clasificación, las clasificaciones no indican una progresión constante de cohesión mejorada. Los estudios de varias personas, incluidos 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.
Si bien la cohesión funcional se considera el tipo de cohesión más deseable para un módulo de software, es posible que no se pueda lograr. Hay casos en los que la cohesión comunicacional es el nivel más alto de cohesión que se puede alcanzar en las circunstancias. [ cita requerida ]
Ver también
Referencias
- ^ a b Yourdon, Edward ; Constantine, Larry LeRoy (1979) [1975]. Diseño estructurado: fundamentos de una disciplina de diseño de sistemas y programas informáticos . Yourdon Press. Bibcode : 1979sdfd.book ..... Y . ISBN 978-0-13-854471-3. ISBN 0-13-854471-9 .
- ^ Ingeno, Joseph (2018). Manual del arquitecto de software . Packt Publishing . pag. 175. ISBN 178862406-8.
- ^ Stevens, Wayne P .; Myers, Glenford J .; Constantine, Larry LeRoy (junio de 1974). "Diseño estructurado". Revista de sistemas de IBM . 13 (2): 115-139. doi : 10.1147 / sj.132.0115 .
- ^ Marsic, Iván (2012). Ingeniería de software . Universidad de Rutgers .
- ^ McConnell, Steve (junio de 2004) [1993]. Código completo (2 ed.). págs. 168-171 . ISBN 978-0-7356-1967-8.
enlaces externos
- Definiciones de métricas de cohesión
- Métricas de cohesión
- Midiendo la cohesión en Python