Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

В программной инженерии , A циклическая зависимость является отношением между двумя или более модулей , которые прямо или косвенно зависят друг от друга , чтобы функционировать должным образом. Такие модули также известны как взаимно рекурсивные .

Обзор [ править ]

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

Проблемы [ править ]

Циклические зависимости могут вызывать множество нежелательных эффектов в программах. Наиболее проблематичным с точки зрения разработки программного обеспечения является тесная связь взаимозависимых модулей, которая уменьшает или делает невозможным раздельное повторное использование одного модуля.

Круговые зависимости могут вызвать эффект домино, когда небольшое локальное изменение в одном модуле распространяется на другие модули и имеет нежелательные глобальные эффекты (программные ошибки, ошибки компиляции). Циклические зависимости также могут привести к бесконечным рекурсиям или другим неожиданным сбоям.

Циклические зависимости также могут вызывать утечку памяти , не позволяя некоторым очень примитивным автоматическим сборщикам мусора (использующим подсчет ссылок ) освобождать неиспользуемые объекты.

Причины и решения [ править ]

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

При реализации функции обратного вызова могут быть введены циклические зависимости. Этого можно избежать, применяя шаблоны проектирования, такие как шаблон наблюдателя .


См. Также [ править ]

Ссылки [ править ]

  1. ^ a b Лакос, Джон (1996-07-20). Крупномасштабный дизайн программного обеспечения C ++ (1-е изд.). Бостон: Эддисон-Уэсли. ISBN 9780201633627.
  2. ^ Мелтон, Хайден; Темперо, Юэн (2007-01-12). «Эмпирическое исследование циклов среди классов в Java». Эмпирическая программная инженерия . 12 (4): 389–415. CiteSeerX 10.1.1.141.5362 . DOI : 10.1007 / s10664-006-9033-1 . ISSN 1382-3256 .  
  3. ^ JDepend для Java