stringtranslate.com

Cohesión (informática)

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 .

Alta cohesión

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.

Cohesión

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.

Tipos de cohesión

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:

Cohesión casual (peor)
La cohesión coincidente se produce cuando las partes de un módulo se agrupan de forma arbitraria. La única relación entre las partes es que se han agrupado juntas (por ejemplo, una clase "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 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 es 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 del mouse y el teclado o agrupar todos los modelos, vistas y controladores en carpetas separadas en un patrón MVC ).
Cohesión temporal
La cohesión temporal se produce cuando las partes de un módulo se agrupan según el momento en el que se procesan. Las partes se procesan en un momento determinado de 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 procedimental es 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 de archivo y luego abre el archivo).
Cohesión comunicacional/informativa
La cohesión comunicacional es 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 de 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 produce cuando las partes de un módulo se agrupan porque todas contribuyen a una única tarea bien definida del módulo (por ejemplo, el 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 específicos separados.  */ 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 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.

Véase también

Referencias

  1. ^ ab Yourdon, Edward ; Constantine, Larry LeRoy (1979) [1975]. Diseño estructurado: Fundamentos de una disciplina de diseño de programas y sistemas informáticos . Yourdon Press. Bibcode :1979sdfd.book.....Y. ISBN 978-0-13-854471-3.
  2. ^ Ingeno, José (2018). Manual del arquitecto de software . Publicación de paquetes . pag. 175.ISBN 978-178862406-0.
  3. ^ Stevens, Wayne P. ; Myers, Glenford J. ; Constantine, Larry LeRoy (junio de 1974). "Diseño estructurado". IBM Systems Journal . 13 (2): 115–139. doi :10.1147/sj.132.0115.
  4. ^ Marsic, Ivan (2012). Ingeniería de software . Universidad Rutgers .
  5. ^ McConnell, Steve (junio de 2004) [1993]. Code Complete (2.ª edición). Pearson Education. Págs. 168-171. ISBN. 978-0-7356-1967-8.

Enlaces externos