Круговая зависимость
![]() | В этой статье есть несколько проблем. Пожалуйста, помогите улучшить его или обсудите эти проблемы на странице обсуждения . ( Узнайте, как и когда удалять эти шаблонные сообщения )
|
В разработке программного обеспечения циклическая зависимость — это связь между двумя или более модулями, которые прямо или косвенно зависят друг от друга для правильного функционирования. Такие модули также известны как взаимно рекурсивные .
Обзор
[ редактировать ]Циклические зависимости естественны во многих моделях предметной области , где определенные объекты одной и той же предметной области зависят друг от друга. [1] Однако при проектировании программного обеспечения циклические зависимости между более крупными программными модулями считаются антишаблоном из-за их негативных последствий. [1] Несмотря на это, такие циклические (или циклические) зависимости широко распространены среди исходных файлов реального программного обеспечения. [2] Однако взаимно рекурсивные модули довольно распространены в функциональном программировании , где часто поощряются индуктивные и рекурсивные определения.
Проблемы
[ редактировать ]Циклические зависимости могут вызывать множество нежелательных эффектов в программах. Наиболее проблематичной с точки зрения разработки программного обеспечения является тесная связь взаимозависимых модулей, которая уменьшает или делает невозможным отдельное повторное использование одного модуля.
Циклические зависимости могут вызвать эффект домино , когда небольшое локальное изменение в одном модуле распространяется на другие модули и имеет нежелательные глобальные последствия (ошибки программы, ошибки компиляции). Циклические зависимости также могут привести к бесконечным рекурсиям или другим неожиданным сбоям.
Циклические зависимости также могут вызывать утечки памяти , не позволяя некоторым автоматическим сборщикам мусора (тех, которые используют подсчет ссылок ) освободить неиспользуемые объекты.
Причины и решения
[ редактировать ]В очень больших проектах программного обеспечения инженеры-программисты могут потерять контекст и непреднамеренно ввести циклические зависимости. Существуют инструменты для анализа программного обеспечения и поиска нежелательных циклических зависимостей. [3]
Циклические зависимости могут быть введены при реализации функции обратного вызова . Этого можно избежать, применяя шаблоны проектирования, такие как шаблон наблюдателя .
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Перейти обратно: а б Лакос, Джон (20 июля 1996 г.). Крупномасштабное проектирование программного обеспечения на C++ (1-е изд.). Бостон: Аддисон-Уэсли. ISBN 9780201633627 .
- ^ Мелтон, Хайден; Темперо, Юэн (12 января 2007 г.). «Эмпирическое исследование циклов среди классов в Java». Эмпирическая программная инженерия . 12 (4): 389–415. CiteSeerX 10.1.1.141.5362 . дои : 10.1007/s10664-006-9033-1 . ISSN 1382-3256 . S2CID 11134940 .
- ^ JDepend для Java