Dependencia circular.
Interdependencia problemática de módulos de software
En ingeniería de software, una dependencia circular (o dependencia cíclica) es una relación entre dos o más módulos que, directa o indirectamente, dependen unos de otros para funcionar correctamente. Dichos módulos también se conocen como mutuamente recursivos.
Visión general
Las dependencias circulares son naturales en muchos modelos de dominio donde ciertos objetos del mismo dominio dependen entre sí. Sin embargo, en el diseño de software, las dependencias circulares entre módulos de software más grandes se consideran un antipatrón por sus efectos negativos. A pesar de ello, se ha comprobado que estas dependencias circulares (o cíclicas) están muy extendidas entre los archivos fuente del software del mundo real. Los módulos mutuamente recursivos son, no obstante, algo comunes en la programación funcional, donde a menudo se fomentan las definiciones inductivas y recursivas.
Problemas
Las dependencias circulares pueden provocar muchos efectos no deseados en los programas de software. Lo más problemático desde el punto de vista del diseño de software es el fuerte acoplamiento de los módulos mutuamente dependientes, que reduce o imposibilita la reutilización por separado de un solo módulo.
Las dependencias circulares pueden causar un efecto dominó cuando un pequeño cambio local en un módulo se propaga a otros módulos y tiene efectos globales no deseados (errores de programa, errores de compilación). Las dependencias circulares también pueden dar lugar a recursiones infinitas u otros fallos inesperados.
Las dependencias circulares también pueden provocar fugas de memoria al impedir que ciertos recolectores de basura automáticos (los que usan conteo de referencias) liberen objetos no utilizados.
Causas y soluciones
En diseños de software muy grandes, los ingenieros de software pueden perder el contexto e introducir dependencias circulares de forma inadvertida. Existen herramientas para analizar el software y encontrar dependencias circulares no deseadas.
Las dependencias circulares pueden introducirse al implementar la funcionalidad de callback. Esto puede evitarse aplicando patrones de diseño como el patrón observador.