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]
Software dependencies can either be explicit or implicit.Examples of explicit dependencies includes:
#include
in C/C++, using
in C# and import
in Java.dependency
tags in Maven configuration).Examples of implicit dependencies includes:[3]
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.
It is in general always possible to break a cyclic dependency chain. The two most common strategies are:[1]