---
title: "Dependencia circular"
type: "antipattern"
slug: "circular-dependency"
url: "http://localhost:3000/es/antipatterns/circular-dependency.md"
description: "Interdependencia problemática de módulos de software"
---
# Dependencia circular

> Interdependencia problemática de módulos de software

En [ingeniería de software](https://en.wikipedia.org/wiki/Software%5Fengineering "Software engineering"), 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](https://en.wikipedia.org/wiki/Mutual%5Frecursion "Mutual recursion").

## Visión general

Las dependencias circulares son naturales en muchos [modelos de dominio](https://en.wikipedia.org/wiki/Domain%5Fmodel "Domain model") donde ciertos objetos del mismo dominio dependen entre sí. Sin embargo, en el [diseño de software](https://en.wikipedia.org/wiki/Software%5Fdesign "Software design"), las dependencias circulares entre módulos de software más grandes se consideran un [antipatrón](https://en.wikipedia.org/wiki/Anti-pattern "Anti-pattern") 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](https://en.wikipedia.org/wiki/Functional%5Fprogramming "Functional programming"), 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](https://en.wikipedia.org/wiki/Coupling%5F%28computer%5Fprogramming%29 "Coupling (computer programming)")_ 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ó](https://en.wikipedia.org/wiki/Domino%5Feffect "Domino effect") 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](https://en.wikipedia.org/wiki/Memory%5Fleak "Memory leak") al impedir que ciertos [recolectores de basura](https://en.wikipedia.org/wiki/Garbage%5Fcollection%5F%28computer%5Fscience%29 "Garbage collection (computer science)") automáticos (los que usan [conteo de referencias](https://en.wikipedia.org/wiki/Reference%5Fcounting "Reference counting")) 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](https://en.wikipedia.org/wiki/Callback%5F%28computer%5Fprogramming%29 "Callback (computer programming)"). Esto puede evitarse aplicando [patrones de diseño](https://en.wikipedia.org/wiki/Software%5Fdesign%5Fpattern "Software design pattern") como el [patrón observador](https://en.wikipedia.org/wiki/Observer%5Fpattern "Observer pattern").
