В программной инженерии циклическая зависимость — это отношение между двумя или более модулями, которые напрямую или косвенно зависят друг от друга для правильного функционирования. Такие модули также известны как взаимно рекурсивные .
Круговые зависимости естественны во многих моделях предметной области , где определенные объекты одной и той же предметной области зависят друг от друга. [1] Однако в проектировании программного обеспечения круговые зависимости между более крупными программными модулями считаются антишаблоном из- за их негативных последствий. [1] Несмотря на это, такие круговые (или циклические) зависимости оказались широко распространенными среди исходных файлов реального программного обеспечения. [2] Однако взаимно рекурсивные модули довольно распространены в функциональном программировании , где часто поощряются индуктивные и рекурсивные определения.
Циклические зависимости могут вызывать множество нежелательных эффектов в программах. Наиболее проблематичным с точки зрения проектирования программного обеспечения является тесная связь взаимозависимых модулей, которая снижает или делает невозможным раздельное повторное использование одного модуля.
Циклические зависимости могут вызвать эффект домино , когда небольшое локальное изменение в одном модуле распространяется на другие модули и имеет нежелательные глобальные эффекты (ошибки программы, ошибки компиляции). Циклические зависимости также могут привести к бесконечным рекурсиям или другим неожиданным сбоям.
Циклические зависимости также могут вызывать утечки памяти , не давая некоторым автоматическим сборщикам мусора (тем, которые используют подсчет ссылок ) освобождать неиспользуемые объекты.
В очень больших проектах программного обеспечения инженеры-программисты могут потерять контекст и непреднамеренно ввести циклические зависимости. Существуют инструменты для анализа программного обеспечения и поиска нежелательных циклических зависимостей. [3]
При реализации функциональности обратного вызова могут быть введены циклические зависимости . Этого можно избежать, применяя шаблоны проектирования, такие как шаблон наблюдателя .