En ingeniería de software , el acoplamiento es el grado de interdependencia entre módulos de software , una medida de cuán estrechamente conectados están dos rutinas o módulos, [ 1 ] y la fuerza de las relaciones entre módulos. [ 2 ] El acoplamiento no es binario sino multidimensional. [ 3 ]

El acoplamiento se suele contrastar con la cohesión . Un bajo acoplamiento a menudo se correlaciona con una alta cohesión, y viceversa. Un bajo acoplamiento suele considerarse un signo de un sistema informático bien estructurado y un buen diseño, y cuando se combina con una alta cohesión, favorece los objetivos generales de alta legibilidad y mantenibilidad . [ 4 ]
Historia
Las métricas de calidad de software de acoplamiento y cohesión fueron inventadas por Larry Constantine a finales de la década de 1960 como parte de un diseño estructurado , basado en características de buenas prácticas de programación que reducían los costos de mantenimiento y modificación. El diseño estructurado, que incluye la cohesión y el acoplamiento, se publicó en el artículo de Stevens, Myers y Constantine (1974) [ 5 ] y en el libro de Yourdon y Constantine (1979) [ 6 ] , y este último se convirtió posteriormente en un término estándar.
Acoplamiento versus cohesión
El acoplamiento y la cohesión son términos que suelen aparecer juntos. El acoplamiento se refiere a las interdependencias entre módulos, mientras que la cohesión describe el grado de relación entre las funciones dentro de un mismo módulo. Una baja cohesión implica que un módulo realiza tareas poco relacionadas entre sí, lo que puede generar problemas a medida que el módulo crece.
Grado

El acoplamiento puede ser "bajo" (también " flojo " y "débil") o "alto" (también "estrecho" y "fuerte"). Algunos tipos de acoplamiento, ordenados de mayor a menor, son los siguientes:
Programación procedimental
Un módulo se refiere aquí a una subrutina de cualquier tipo, es decir, un conjunto de una o más instrucciones que tienen un nombre y, preferiblemente, su propio conjunto de nombres de variables.
- Acoplamiento de contenido (alto)
- Se dice que existe acoplamiento de contenido cuando un módulo utiliza el código de otro módulo, por ejemplo, una bifurcación. Esto viola el principio de ocultación de información , un concepto básico del diseño de software.
- Acoplamiento común
- Se dice que existe acoplamiento común cuando varios módulos tienen acceso a los mismos datos globales. Sin embargo, esto puede provocar una propagación de errores incontrolada y efectos secundarios imprevistos al realizar cambios.
- Acoplamiento externo
- El acoplamiento externo se produce cuando dos módulos comparten un formato de datos, un protocolo de comunicación o una interfaz de dispositivo impuestos externamente. Esto se relaciona fundamentalmente con la comunicación con herramientas y dispositivos externos.
- Acoplamiento de control
- El acoplamiento de control consiste en que un módulo controla el flujo de otro, pasándole información sobre qué hacer (por ejemplo, pasándole un indicador de qué hacer).
- Acoplamiento de sellos (acoplamiento estructurado de datos)
- El acoplamiento de sellos se produce cuando los módulos comparten una estructura de datos compuesta y utilizan solo partes de ella, posiblemente partes diferentes (por ejemplo, pasar un registro completo a una función que solo necesita un campo del mismo).
- En esta situación, una modificación en un campo que un módulo no necesita puede provocar un cambio en la forma en que el módulo lee el registro. Para ilustrar el concepto de acoplamiento de sellos, consideremos un escenario que involucra un
UserProfilecomponente . Este componente está diseñado para devolver toda la información del perfil del usuario en respuesta a las solicitudes , incluso cuando los consumidores solo requieren un atributo específico . Esta práctica ejemplifica el acoplamiento de sellos, que puede generar problemas de ancho de banda significativos , especialmente a gran escala. Cuando cambia cualquier atributo dentro delUserProfilecomponente, todos los consumidores que interactúan con él pueden necesitar someterse a pruebas , incluso si no utilizan el atributo modificado. [ 7 ] - Acoplamiento de datos
- El acoplamiento de datos se produce cuando los módulos comparten datos, por ejemplo, a través de parámetros. Cada dato es una unidad elemental, y estos son los únicos datos que se comparten (por ejemplo, pasar un número entero a una función que calcula una raíz cuadrada).
Programación orientada a objetos
- Acoplamiento de subclases
- Describe la relación entre un hijo y su padre. El hijo está conectado con su padre, pero el padre no está conectado con el hijo.
- Acoplamiento temporal
- Se produce cuando dos acciones se agrupan en un solo módulo simplemente porque ocurren al mismo tiempo.
En trabajos recientes se han investigado otros conceptos de acoplamiento y se han utilizado como indicadores de diferentes principios de modularización empleados en la práctica. [ 8 ]
Acoplamiento dinámico
El objetivo de definir y medir este tipo de acoplamiento es proporcionar una evaluación en tiempo de ejecución de un sistema de software . Se ha argumentado que las métricas de acoplamiento estático pierden precisión al tratar con un uso intensivo de enlace dinámico o herencia. [ 9 ] En un intento por resolver este problema, se han tomado en cuenta las medidas de acoplamiento dinámico.
Acoplamiento semántico
Este tipo de métrica de acoplamiento considera las similitudes conceptuales entre entidades de software utilizando, por ejemplo, comentarios e identificadores, y basándose en técnicas como la indexación semántica latente (LSI).
Acoplamiento lógico
El análisis de acoplamiento lógico (o acoplamiento evolutivo o acoplamiento de cambios) aprovecha el historial de versiones de un sistema de software para encontrar patrones de cambio entre módulos o clases: por ejemplo, entidades que probablemente se modifiquen juntas o secuencias de cambios (un cambio en una clase A siempre va seguido de un cambio en una clase B).
Dimensiones del acoplamiento
Según Gregor Hohpe, el acoplamiento es multidimensional: [ 3 ]
- Dependencia tecnológica
- Dependencia de la ubicación
- Dependencia topológica
- Dependencia del formato y tipo de datos
- Dependencia semántica
- Dependencia de la conversación
- Dependencia del orden
- Dependencia temporal
Desventajas del acoplamiento estrecho
Los sistemas estrechamente acoplados tienden a presentar las siguientes características de desarrollo, que a menudo se consideran desventajas:
- Un cambio en un módulo suele provocar un efecto dominó de cambios en otros módulos.
- El ensamblaje de módulos podría requerir más esfuerzo y/o tiempo debido a la mayor dependencia entre ellos.
- Un módulo en particular podría ser más difícil de reutilizar y/o probar porque es necesario incluir módulos dependientes.
Problemas de rendimiento
Ya sea con un acoplamiento flexible o estricto, el rendimiento de un sistema suele verse reducido por la creación, transmisión, traducción (por ejemplo, serialización) e interpretación de mensajes y parámetros (que puede ser una referencia a una cadena, matriz o estructura de datos), procesos que requieren menos recursos que la creación de un mensaje complejo como un mensaje SOAP . Los mensajes más largos requieren más CPU y memoria para su producción. Para optimizar el rendimiento en tiempo de ejecución, la longitud del mensaje debe minimizarse y su significado debe maximizarse.
- Sobrecarga y rendimiento de la transmisión de mensajes
- Dado que un mensaje debe transmitirse íntegramente para conservar su significado completo, es necesario optimizar la transmisión. Los mensajes más largos requieren más CPU y memoria para su transmisión y recepción. Además, cuando es necesario, los receptores deben reconstruir el mensaje a su estado original para recibirlo por completo. Por lo tanto, para optimizar el rendimiento, la longitud del mensaje debe minimizarse y su significado debe maximizarse.
- Sobrecarga y rendimiento de la traducción de mensajes
- Los protocolos y los mensajes en sí mismos suelen contener información adicional (como información sobre paquetes, estructura, definición e idioma). Por lo tanto, el receptor a menudo necesita traducir un mensaje a un formato más refinado, eliminando caracteres y estructura innecesarios o convirtiendo valores de un tipo a otro. Cualquier tipo de traducción aumenta el consumo de CPU y/o memoria. Para optimizar el rendimiento, el formato y el contenido del mensaje deben simplificarse y refinarse para maximizar su significado y minimizar la traducción.
- Sobrecarga y rendimiento de la interpretación de mensajes
- Todos los mensajes deben ser interpretados por el receptor. Los mensajes simples, como los números enteros, podrían no requerir procesamiento adicional para su interpretación. Sin embargo, los mensajes complejos, como los mensajes SOAP, requieren un analizador sintáctico y un transformador de cadenas para que muestren el significado previsto. Para optimizar el rendimiento en tiempo de ejecución, los mensajes deben refinarse y simplificarse para minimizar la sobrecarga de interpretación.
Soluciones
Un enfoque para disminuir el acoplamiento es el diseño funcional , que busca limitar las responsabilidades de los módulos según su funcionalidad. El acoplamiento aumenta entre dos clases Asi B:
Atiene un atributo que hace referencia a (es de tipo)B.Arealiza llamadas a los servicios de un objetoB.Atiene un método que hace referenciaB(a través del tipo de retorno o parámetro).Aes una subclase de (o implementa) la claseB.
El acoplamiento bajo se refiere a una relación en la que un módulo interactúa con otro módulo a través de una interfaz simple y estable y no necesita preocuparse por la implementación interna del otro módulo (véase Ocultación de información ).
Sistemas como CORBA o COM permiten que los objetos se comuniquen entre sí sin necesidad de conocer la implementación del otro objeto. Ambos sistemas incluso permiten que los objetos se comuniquen con objetos escritos en otros lenguajes.
Acoplamiento vs. Connascencia
El acoplamiento describe el grado y la naturaleza de la dependencia entre componentes de software, centrándose en lo que comparten (por ejemplo, datos, flujo de control , tecnología) y cuán estrechamente están vinculados. Evalúa dos dimensiones clave: la fuerza, que mide la dificultad de cambiar la dependencia, y el alcance (o visibilidad), que indica cuán expuesta está la dependencia a través de módulos o límites. Los tipos de acoplamiento tradicionales suelen incluir el acoplamiento de contenido, el acoplamiento común, el acoplamiento de control, el acoplamiento de marca de tiempo, el acoplamiento externo y el acoplamiento de datos. [ 10 ] [ 11 ] [ 12 ]
Connascence , introducido por Meilir Page-Jones, proporciona un marco sistemático para analizar y medir las dependencias de acoplamiento. Evalúa las dependencias en función de tres dimensiones: fuerza, que mide el esfuerzo necesario para refactorizar o modificar la dependencia; localidad, que considera cuán cerca física o lógicamente están los componentes dependientes en el código ; y grado, que mide cuántos componentes se ven afectados por la dependencia. Connascence se puede categorizar en formas estáticas (detectables en tiempo de compilación) y dinámicas (detectables en tiempo de ejecución). Connascence estático se refiere a dependencias en tiempo de compilación, como firmas de métodos, mientras que Connascence dinámico se refiere a dependencias en tiempo de ejecución, que pueden manifestarse en formas como Connascence de tiempo, valores o algoritmo. [ 10 ] [ 11 ] [ 12 ]
Cada tipo de acoplamiento puede presentar múltiples tipos de connascencia, un tipo específico o, en casos excepcionales, ninguno, dependiendo de cómo se implemente la dependencia. Los tipos comunes de connascencia incluyen la connascencia de nombre, tipo, posición y significado. Ciertos tipos de acoplamiento se alinean naturalmente con tipos de connascencia específicos; por ejemplo, el acoplamiento de datos suele implicar la connascencia de nombre o tipo. Sin embargo, no todas las combinaciones de acoplamiento y connascencia tienen sentido práctico. Las dependencias que dependen del orden de los parámetros en la firma de un método demuestran la connascencia de posición, que es frágil y difícil de refactorizar porque reordenar los parámetros rompe la interfaz. Por el contrario, la connascencia de nombre, que depende de los nombres de los campos o parámetros, suele ser más resistente a los cambios. Los tipos de connascencia en sí mismos presentan una jerarquía natural de fuerza, considerándose la connascencia de nombre generalmente más débil que la connascencia de significado. [ 10 ] [ 11 ] [ 12 ]
Las dependencias que abarcan los límites de los módulos o los sistemas distribuidos suelen tener mayores costos de coordinación, lo que aumenta la dificultad de la refactorización y la propagación de cambios a través de límites distantes. Las prácticas modernas, como la inyección de dependencias y la programación basada en interfaces, se emplean a menudo para reducir la fuerza de acoplamiento y mejorar la mantenibilidad de las dependencias. [ 10 ] [ 11 ] [ 12 ]
Mientras que el acoplamiento identifica lo que se comparte entre los componentes, la connascencia evalúa cómo se comportan esas dependencias, cómo se propagan los cambios y cuán difícil es refactorizarlas. La fuerza, la localidad y el grado están interrelacionados; las dependencias con alta fuerza, amplio alcance y que abarcan límites distantes son significativamente más difíciles de refactorizar y mantener. En conjunto, el acoplamiento proporciona una visión general de alto nivel de las relaciones de dependencia, mientras que la connascencia ofrece un marco granular para analizar la fuerza, la localidad, el grado y la resiliencia al cambio de las dependencias, lo que apoya el diseño de sistemas robustos y mantenibles. [ 10 ] [ 11 ] [ 12 ]
Acoplamiento de módulos
El acoplamiento en la ingeniería de software [ 13 ] describe una versión de las métricas asociadas con este concepto.
Para el acoplamiento del flujo de datos y control:
- : número de parámetros de datos de entrada
- : número de parámetros de control de entrada
- : número de parámetros de datos de salida
- : número de parámetros de control de salida
Para el acoplamiento global:
- : número de variables globales utilizadas como datos
- : número de variables globales utilizadas como control
Para el acoplamiento ambiental:
- : número de módulos llamados (distribución)
- : número de módulos que llaman al módulo en cuestión (fan-in)
Coupling(C)Cuanto mayor sea el acoplamiento del módulo, mayor será el valor. Este número oscila aproximadamente entre 0,67 (acoplamiento bajo) y 1,0 (acoplamiento alto).
Por ejemplo, si un módulo tiene un único parámetro de datos de entrada y salida.
Si un módulo tiene 5 parámetros de datos de entrada y salida, un número igual de parámetros de control y accede a 10 elementos de datos globales, con un fan-in de 3 y un fan-out de 4,
Véase también
Referencias
- ↑ ISO/IEC/IEEE 24765:2010 Ingeniería de sistemas y software — Vocabulario
- ↑ ISO/IEC TR 19759:2005, Ingeniería de software: Guía del conjunto de conocimientos de ingeniería de software (SWEBOK)
- 1 2 Hohpe, Gregor (2004). Patrones de integración empresarial: diseño, construcción e implementación de soluciones de mensajería . Addison-Wesley Professional. ISBN 978-0321200686.
- ↑ Fregnan, Enrico; Baum, Tobias; Palomba, Fabio; Bacchelli, Alberto (marzo de 2019). "Un estudio sobre las relaciones y herramientas de acoplamiento de software" . Information and Software Technology . 107 : 159–178 . doi : 10.1016/J.INFSOF.2018.11.008 . ISSN 0950-5849 . Consultado el 20 de mayo de 2026 .
- ↑ 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 .
- ↑ 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.
- ↑ Richards, Mark. Fundamentos de la arquitectura de software: Un enfoque de ingeniería . O'Reilly Media. ISBN 978-1492043454.
- ↑ Beck, Fabian; Diehl, Stephan (septiembre de 2011). «Sobre la congruencia de la modularidad y el acoplamiento de código». En Actas del 19.º Simposio ACM SIGSOFT y la 13.ª Conferencia Europea sobre Fundamentos de la Ingeniería de Software (SIGSOFT/FSE '11) . Szeged, Hungría. pág. 354. doi : 10.1145/2025113.2025162 . ISBN 9781450304436. S2CID 2413103 .
{{cite book}}: CS1 mantenimiento: falta el editor de ubicación ( enlace ) - ↑ Arisholm, Erik; Briand, Lionel C. ; Føyen, Audun (agosto de 2004). "Medición de acoplamiento dinámico para software orientado a objetos". IEEE Transactions on Software Engineering . 30 (8). IEEE : 491– 506. Bibcode : 2004ITSEn..30..491A . doi : 10.1109/TSE.2004.41 . hdl : 10852/9090 . S2CID 3074827 .
- 1 2 3 4 5 Page-Jones, Meilir (1988). Guía práctica para el diseño de sistemas estructurados . Prentice Hall. ISBN 978-0136907695.
- 1 2 3 4 5 Kleppmann, Martin (2017). Diseño de aplicaciones con gran cantidad de datos: Las grandes ideas detrás de sistemas fiables, escalables y mantenibles . O'Reilly Media. ISBN 978-1449373320.
- 1 2 3 4 5 Fundamentos de la arquitectura de software: Un enfoque de ingeniería . ISBN 978-1492043454.
- ↑ Pressman, Roger S. (1982). Ingeniería de software: un enfoque práctico (4.ª ed.). McGraw-Hill. ISBN 0-07-052182-4.
Lecturas adicionales
- Myers, Glenford J. (1974). Software confiable mediante diseño compuesto . Nueva York: Mason and Lipscomb Publishers.
- Offutt, A. Jefferson; Harrold, Mary Jean ; Kolte, Priyadarshan (marzo de 1993). "Un sistema de métricas de software para el acoplamiento de módulos". Journal of Systems and Software . 20 (3): 295– 308. doi : 10.1016/0164-1212(93)90072-6 .
- Page-Jones, Meilir (1980). Guía práctica para el diseño de sistemas estructurados . Nueva York: Yourdon Press. ISBN 978-8-12031482-5.
- Glosario estándar de terminología de ingeniería de software . Nueva York: IEEE . 1990. ISBN 0-7381-0391-8. 610.12_1990.
- "Plan de estudios para Profesional Certificado en Arquitectura de Software (CPSA) - Nivel Básico" (PDF) . 3.01. International Software Architecture Qualification Board eV (ISAQB). 15 de mayo de 2015 [2009]. Archivado del original (PDF) el 29 de marzo de 2017. Consultado el 23 de junio de 2019 .Archivado el 22 de febrero de 2016 en Wayback Machine.
- Principios de programación
- Programación orientada a objetos
- Arquitectura de software
- Métricas de software