Acyclic dependencies principle
The acyclic dependencies principle is a software design principle defined by Robert C. Martin that states that "the dependency graph of packages or components should have no cycles". This implies that the dependencies form a directed acyclic graph.
Example
In this UML package diagram, package A depends on packages B and C. Package B in turn depends on package D, which depends on package C, which in turn depends on package B. The latter three dependencies create a cycle, which must be broken in order to adhere to the acyclic dependencies principle.Types of dependencies
Software dependencies can either be explicit or implicit.Examples of explicit dependencies includes:
- Include statements, such as
#includein C/C++,usingin C# andimportin Java. - Dependencies stated in the build system.
- Relying on specific behaviour that is not well-defined by the interface exposed.
- Network protocols.
- Routing of messages over a software bus.
Cycle breaking strategies
It is in general always possible to break a cyclic dependency chain. The two most common strategies are:- Dependency inversion principle
- Create a new package, and move the common dependencies there.