---
title: "Dependência circular"
type: "antipattern"
slug: "circular-dependency"
url: "http://localhost:3000/pt-br/antipatterns/circular-dependency.md"
description: "Interdependência problemática de módulos de software"
---
# Dependência circular

> Interdependência problemática de módulos de software

Na [engenharia de software](https://en.wikipedia.org/wiki/Software%5Fengineering "Software engineering"), uma **dependência circular** (ou **dependência cíclica**) é uma relação entre dois ou mais módulos que dependem direta ou indiretamente uns dos outros para funcionar corretamente. Tais módulos também são conhecidos como [mutuamente recursivos](https://en.wikipedia.org/wiki/Mutual%5Frecursion "Mutual recursion").

## Visão geral

Dependências circulares são naturais em muitos [modelos de domínio](https://en.wikipedia.org/wiki/Domain%5Fmodel "Domain model") em que certos objetos do mesmo domínio dependem uns dos outros. Entretanto, no [design de software](https://en.wikipedia.org/wiki/Software%5Fdesign "Software design"), dependências circulares entre módulos de software maiores são consideradas um [antipadrão](https://en.wikipedia.org/wiki/Anti-pattern "Anti-pattern") por causa de seus efeitos negativos. Apesar disso, constatou-se que tais dependências circulares (ou cíclicas) são generalizadas entre os arquivos de código-fonte de software do mundo real. Módulos mutuamente recursivos são, contudo, relativamente comuns na [programação funcional](https://en.wikipedia.org/wiki/Functional%5Fprogramming "Functional programming"), onde definições indutivas e recursivas são frequentemente incentivadas.

## Problemas

Dependências circulares podem causar muitos efeitos indesejados em programas de software. O mais problemático do ponto de vista do design de software é o _[acoplamento](https://en.wikipedia.org/wiki/Coupling%5F%28computer%5Fprogramming%29 "Coupling (computer programming)") forte_ dos módulos mutuamente dependentes, que reduz ou torna impossível a reutilização separada de um único módulo.

Dependências circulares podem causar um [efeito dominó](https://en.wikipedia.org/wiki/Domino%5Feffect "Domino effect") quando uma pequena mudança local em um módulo se espalha para outros módulos e tem efeitos globais indesejados (erros de programa, erros de compilação). Dependências circulares também podem resultar em recursões infinitas ou outras falhas inesperadas.

Dependências circulares também podem causar [vazamentos de memória](https://en.wikipedia.org/wiki/Memory%5Fleak "Memory leak") ao impedir que certos [coletores de lixo](https://en.wikipedia.org/wiki/Garbage%5Fcollection%5F%28computer%5Fscience%29 "Garbage collection (computer science)") automáticos (aqueles que usam [contagem de referências](https://en.wikipedia.org/wiki/Reference%5Fcounting "Reference counting")) desaloquem objetos não utilizados.

## Causas e soluções

Em projetos de software muito grandes, os engenheiros de software podem perder o contexto e inadvertidamente introduzir dependências circulares. Existem ferramentas para analisar software e encontrar dependências circulares indesejadas.

Dependências circulares podem ser introduzidas ao implementar a funcionalidade de [callback](https://en.wikipedia.org/wiki/Callback%5F%28computer%5Fprogramming%29 "Callback (computer programming)"). Isso pode ser evitado aplicando [padrões de projeto](https://en.wikipedia.org/wiki/Software%5Fdesign%5Fpattern "Software design pattern") como o [padrão observador](https://en.wikipedia.org/wiki/Observer%5Fpattern "Observer pattern").
