En la ingeniería de software , una dependencia circular es una relación entre dos o más módulos que dependen directa o indirectamente entre sí para funcionar correctamente. Estos módulos también se conocen como recursivos entre sí .
Descripción general
Las dependencias circulares son naturales en muchos modelos de dominio donde ciertos objetos del mismo dominio dependen unos de otros. [1] Sin embargo, en el diseño de software , las dependencias circulares entre módulos de software más grandes se consideran un antipatrón debido a sus efectos negativos. [1] A pesar de esto, se ha encontrado que tales dependencias circulares (o cíclicas) están muy extendidas entre los archivos fuente del software del mundo real. [2] Los módulos recursivos mutuos son, sin embargo, algo comunes en la programación funcional , donde a menudo se alientan las definiciones inductivas y recursivas.
Problemas
Las dependencias circulares pueden causar 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 estrecho acoplamiento de los módulos mutuamente dependientes que reduce o hace imposible 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 resultar en infinitas recursiones u otros fallos inesperados.
Las dependencias circulares también pueden causar pérdidas de memoria al evitar que ciertos recolectores de basura automáticos muy primitivos (aquellos que usan el conteo de referencias ) desasignen los objetos no utilizados.
Causas y soluciones
En diseños de software muy grandes, los ingenieros de software pueden perder el contexto e introducir inadvertidamente dependencias circulares. Existen herramientas para analizar software y encontrar dependencias circulares no deseadas. [3]
Se pueden introducir dependencias circulares al implementar la funcionalidad de devolución de llamada . Esto se puede evitar aplicando patrones de diseño como el patrón del observador .
Ver también
Referencias
- ↑ a b Lakos, John (20 de julio de 1996). Diseño de software C ++ a gran escala (1ª ed.). Boston: Addison-Wesley. ISBN 9780201633627.
- ^ Melton, Hayden; Tempero, Ewan (12 de enero de 2007). "Un estudio empírico de ciclos entre clases en Java". Ingeniería de software empírica . 12 (4): 389–415. CiteSeerX 10.1.1.141.5362 . doi : 10.1007 / s10664-006-9033-1 . ISSN 1382-3256 .
- ^ JDepend para Java