El término cohesión se utilizó originalmente para describir módulos de código fuente como una medida cualitativa de qué tan bien se relacionaba el código fuente del módulo entre sí. La idea de cohesión se utiliza en una variedad de campos. Por ejemplo, un grupo de personas, como una unidad militar, puede ser cohesivo, lo que significa que las personas de la unidad trabajan juntas hacia un objetivo común.
La esencia de la cohesión del código fuente es que el código fuente de un módulo trabaje en conjunto hacia un objetivo común y bien definido. La cantidad mínima de código fuente necesaria para crear las salidas del módulo está en el módulo y no más. La interfaz está bien definida y las entradas fluyen a través de la interfaz y las salidas fluyen de regreso a través de la interfaz. No hay efectos secundarios y el énfasis está en el minimalismo.
Una ventaja de los módulos funcionalmente cohesivos es que desarrollar y automatizar pruebas unitarias es sencillo. De hecho, una buena medida de la cohesión de un módulo es lo fácil que es crear un conjunto completo de pruebas unitarias exhaustivas para el módulo.
Un módulo puede ser una clase en un lenguaje orientado a objetos o una función en un lenguaje funcional o un lenguaje no orientado a objetos como C. Gran parte del trabajo original en esta área de medición de la cohesión involucraba principalmente el trabajo con programas COBOL en IBM en el 1970, por lo que la cohesión definitivamente no es solo un concepto orientado a objetos.
La intención original de la investigación de la que surgió el concepto de cohesión y el concepto asociado de acoplamiento fue investigar cuáles eran las características de los programas que eran fáciles de entender, mantener y ampliar. El objetivo era poder aprender las mejores prácticas de programación, codificar esas mejores prácticas y luego enseñar las prácticas a otros programadores.
El objetivo de los buenos programadores es escribir código fuente cuya cohesión sea lo más alta posible dado el entorno y el problema que se está resolviendo. Esto implica que en una aplicación grande algunas partes del cuerpo del código fuente variarán de otras partes en cuanto al nivel de cohesión del código fuente en ese módulo o clase. Algunas veces, lo mejor que puede obtener es la cohesión temporal o secuencial debido al problema que está tratando de resolver.
El mejor nivel de cohesión es la cohesión funcional. Un módulo con cohesión funcional es similar a una función matemática en el sentido de que proporciona un conjunto de entradas y obtiene una salida específica. Un módulo verdaderamente funcional no tendrá efectos secundarios además de la salida ni mantendrá ningún tipo de estado. En cambio, tendrá una interfaz bien definida que encapsula la funcionalidad del módulo sin exponer ninguno de los componentes internos del módulo y la persona que usa el módulo proporcionará un conjunto particular de entradas y obtendrá una salida particular a cambio. Un módulo verdaderamente funcional también debería ser seguro para subprocesos.
Muchas bibliotecas de lenguajes de programación contienen varios ejemplos de módulos funcionales, ya sean clases, plantillas o funciones. Los ejemplos de cohesión más funcionales serían funciones matemáticas como pecado, coseno, raíz cuadrada, etc.
Otras funciones pueden tener efectos secundarios o mantener algún tipo de estado, lo que hace que el uso de esas funciones sea más complicado.
Por ejemplo, una función que lanza una excepción o establece una variable de error global ( errno
en C) o debe usarse en una secuencia (la strtok()
función es un ejemplo de la biblioteca C estándar ya que mantiene un estado interno) o que proporciona un puntero que luego debe administrarse o enviar un registro a alguna utilidad de registro son todos ejemplos de una función que ya no es cohesión funcional.
He leído el libro original de Yourdon y Constantine, Structured Programming, donde me topé por primera vez con la idea de cohesión en la década de 1980 y el libro de Meilir Page-Jones Practical Guide to Structured Systems Design, y Page-Jones hizo un trabajo mucho mejor al describir tanto el acoplamiento como la cohesión. El libro de Yourdon y Constantine parece un poco más académico. El libro Code Complete de Steve McConnell es bastante bueno y práctico y la edición revisada tiene bastante que decir sobre las buenas prácticas de programación.