Сравнивайте с английским: нажмите на абзац — оригинал откроется в окне. Кнопка EN под абзацем показывает его прямо в тексте.
Содержание
Введение
Проблемная взаимозависимость программных модулей
Problematic interdependence of software modules
В разработке программного обеспечения круговая зависимость — это отношение между двумя или более модулями, которые напрямую или косвенно зависят друг от друга для корректной работы. Такие модули также известны как взаимно рекурсивные.
In software engineering, a circular dependency is a relation between two or more modules which either directly or indirectly depend on each other to function properly. Such modules are also known as mutually recursive.
Обзор
Круговые зависимости естественны во многих предметных областях, где определенные объекты одной и той же области зависят друг от друга. Однако в проектировании программного обеспечения круговые зависимости между крупными программными модулями рассматриваются как антипаттерн из-за их негативного влияния. Взаимно рекурсивные модули, тем не менее, довольно распространены в функциональном программировании, где часто приветствуются индуктивные и рекурсивные определения.
Circular dependencies are natural in many domain models where certain objects of the same domain depend on each other. However, in software design, circular dependencies between larger software modules are considered an anti pattern because of their negative effects. Mutually recursive modules are, however, somewhat common in functional programming, where inductive and recursive definitions are often encouraged.
Проблемы
Круговые зависимости могут вызывать множество нежелательных эффектов в программном обеспечении. Наиболее проблематичным с точки зрения проектирования является тесная связанность взаимозависимых модулей, что снижает или делает невозможным повторное использование отдельного модуля. Круговые зависимости могут привести к эффекту домино, когда небольшое локальное изменение в одном модуле распространяется на другие и вызывает нежелательные глобальные последствия (ошибки в программе, ошибки компиляции). Круговые зависимости также могут приводить к бесконечной рекурсии или другим неожиданным сбоям. Кроме того, они могут вызывать утечки памяти, препятствуя автоматическим сборщикам мусора (особенно использующим подсчет ссылок) в освобождении неиспользуемых объектов.
Circular dependencies can cause many unwanted effects in software programs. Most problematic from a software design point of view is the tight coupling of the mutually dependent modules which reduces or makes impossible the separate re use of a single module. Circular dependencies can cause a domino effect when a small local change in one module spreads into other modules and has unwanted global effects (program errors, compile errors). Circular dependencies can also result in infinite recursions or other unexpected failures. Circular dependencies may also cause memory leaks by preventing certain automatic garbage collectors (those that use reference counting) from deallocating unused objects.
Причины и решения
В очень больших программных проектах разработчики могут потерять контекст и непреднамеренно создать циклические зависимости. Существуют инструменты для анализа программного обеспечения и выявления нежелательных циклических зависимостей. Циклические зависимости могут возникать при реализации функциональности обратных вызовов. Их можно избежать, применяя шаблоны проектирования, такие как шаблон наблюдатель.
In very large software designs, software engineers may lose the context and inadvertently introduce circular dependencies. There are tools to analyze software and find unwanted circular dependencies. Circular dependencies can be introduced when implementing callback functionality. This can be avoided by applying design patterns like the observer pattern.