Dependência circular - Circular dependency

Na engenharia de software , uma dependência circular é uma relação entre dois ou mais módulos que direta ou indiretamente dependem um do outro para funcionar corretamente. Esses módulos também são conhecidos como recursivos mutuamente .

Visão geral

Dependências circulares são naturais em muitos modelos de domínio, onde certos objetos do mesmo domínio dependem uns dos outros. No entanto, no design de software , dependências circulares entre módulos de software maiores são consideradas um antipadrão por causa de seus efeitos negativos. Apesar disso, descobriu-se que tais dependências circulares (ou cíclicas) são comuns entre os arquivos de origem de software do mundo real. Módulos mutuamente recursivos são, entretanto, um tanto comuns na programação funcional , onde as definições indutivas e recursivas são freqüentemente encorajadas.

Problemas

Dependências circulares podem causar muitos efeitos indesejados em programas de software. Mais problemático do ponto de vista do projeto de software é o acoplamento estreito dos módulos mutuamente dependentes, o que reduz ou torna impossível a reutilização separada de um único módulo.

Dependências circulares podem causar um efeito dominó 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 , evitando que certos coletores de lixo automáticos muito primitivos (aqueles que usam contagem de referência ) desaloquem objetos não utilizados.

Causas e soluções

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

As dependências circulares podem ser introduzidas ao implementar a funcionalidade de retorno de chamada . Isso pode ser evitado aplicando padrões de projeto como o padrão do observador .

Veja também

Referências