stringtranslate.com

Круговая зависимость

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

Обзор

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

Проблемы

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

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

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

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

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

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

Смотрите также

Ссылки

  1. ^ ab Lakos, John (1996-07-20). Проектирование крупномасштабного программного обеспечения на C++ (1-е изд.). Бостон: Addison-Wesley. 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. S2CID  11134940. 
  3. ^ JDepend для Java