Acyclic dependencies principle
From Wikipedia, the free encyclopedia
The acyclic dependencies principle (ADP) is a software design principle defined by Robert C. Martin that states that "the dependency graph of packages or components should have no cycles".[1] This implies that the dependencies form a directed acyclic graph.

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.[2]
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 (e.g.
dependencytags in Maven configuration).
Examples of implicit dependencies includes:[3]
- Relying on specific behaviour that is not well-defined by the interface exposed.
- Network protocols.
- Routing of messages over a software bus.
In general, it's considered good practice to prefer explicit dependencies whenever possible. This is because explicit dependencies are easier to map and analyze than implicit dependencies.