---
title: "Циклическая зависимость"
type: "antipattern"
slug: "circular-dependency"
url: "http://localhost:3000/ru/antipatterns/circular-dependency.md"
description: "Проблематичная взаимозависимость программных модулей"
---
# Циклическая зависимость

> Проблематичная взаимозависимость программных модулей

В [программной инженерии](https://en.wikipedia.org/wiki/Software%5Fengineering "Software engineering") **циклическая зависимость** (или **круговая зависимость**) — это отношение между двумя или более модулями, которые прямо или косвенно зависят друг от друга для корректной работы. Такие модули также называют [взаимно рекурсивными](https://en.wikipedia.org/wiki/Mutual%5Frecursion "Mutual recursion").

## Обзор

Циклические зависимости естественны во многих [моделях предметной области](https://en.wikipedia.org/wiki/Domain%5Fmodel "Domain model"), где определённые объекты одной предметной области зависят друг от друга. Однако в [проектировании ПО](https://en.wikipedia.org/wiki/Software%5Fdesign "Software design") циклические зависимости между более крупными программными модулями считаются [антипаттерном](https://en.wikipedia.org/wiki/Anti-pattern "Anti-pattern") из-за их негативных эффектов. Несмотря на это, такие циклические (или круговые) зависимости оказались широко распространены среди исходных файлов реального ПО. Взаимно рекурсивные модули, впрочем, довольно обычны в [функциональном программировании](https://en.wikipedia.org/wiki/Functional%5Fprogramming "Functional programming"), где индуктивные и рекурсивные определения часто поощряются.

## Проблемы

Циклические зависимости могут вызывать множество нежелательных эффектов в программах. С точки зрения проектирования ПО наиболее проблематична _тесная [связанность](https://en.wikipedia.org/wiki/Coupling%5F%28computer%5Fprogramming%29 "Coupling (computer programming)")_ взаимозависимых модулей, которая снижает или делает невозможным раздельное переиспользование отдельного модуля.

Циклические зависимости могут вызывать [эффект домино](https://en.wikipedia.org/wiki/Domino%5Feffect "Domino effect"), когда небольшое локальное изменение в одном модуле распространяется на другие модули и приводит к нежелательным глобальным эффектам (ошибкам программы, ошибкам компиляции). Циклические зависимости также могут приводить к бесконечной рекурсии или иным неожиданным сбоям.

Циклические зависимости могут также вызывать [утечки памяти](https://en.wikipedia.org/wiki/Memory%5Fleak "Memory leak"), мешая некоторым автоматическим [сборщикам мусора](https://en.wikipedia.org/wiki/Garbage%5Fcollection%5F%28computer%5Fscience%29 "Garbage collection (computer science)") (тем, что используют [подсчёт ссылок](https://en.wikipedia.org/wiki/Reference%5Fcounting "Reference counting")) освобождать неиспользуемые объекты.

## Причины и решения

В очень больших программных проектах инженеры могут терять контекст и непреднамеренно вводить циклические зависимости. Существуют инструменты для анализа ПО и поиска нежелательных циклических зависимостей.

Циклические зависимости могут возникать при реализации функциональности [обратного вызова](https://en.wikipedia.org/wiki/Callback%5F%28computer%5Fprogramming%29 "Callback (computer programming)"). Этого можно избежать, применяя [паттерны проектирования](https://en.wikipedia.org/wiki/Software%5Fdesign%5Fpattern "Software design pattern"), такие как [паттерн «наблюдатель»](https://en.wikipedia.org/wiki/Observer%5Fpattern "Observer pattern").
