The Acyclic Dependencies Principle (ADP) 非環式依存原則


非環式依存原則とは

パッケージ間の依存構造グラフは無閉路有向グラフでなければならない。つまり依存構造が循環してはならない

The dependency structure between packages must be a directed acyclic graph (DAG). That is, there must be no cycles in the dependency structure.


パッケージの依存関係は循環してはならない

The dependencies betwen packages must not form cycles.[by Martin]

内容

パッケージ間の依存関係についての原則になります。ADP は、依存関係が循環してはいけないということを述べています。パッケージの依存関係がどこかで循環していると、それらのパッケージを単独でアップデートすることはできません。アップデートするとしたら、循環しているパッケージ全体を一度に行わなければならないのです。この原則は必ず守らなければならないものといってよいでしょう。


パッケージ間に依存の循環があれば、1つのパッケージ内のクラスに対する修正の影響が、関連するすべてのパッケージに及ぶ。パッケージをビルドする順番に制約があるような場合がよい例である。これではせっかくパッケージとして分割されていても、実際は分割されていないのと同じである。

パッケージ間の循環を断つ手段として次の2つの方法が存在する。

 1つ目の方法は、クラスに関する設計原則である「依存関係逆転の原則」を適用する方法。例えばパッケージMyGuiPartsのクラスXがパッケージMyApplicationのクラスYに依存しているような場合には、パッケージMyGuiParts内にクラスXが利用する抽象インターフェイスを配置し、その派生クラスとしてYクラスをパッケージMyApplication内に配置する。こうすることでパッケージMyGuiPartsとパッケージMyApplicationの依存関係が逆転して循環が断たれる。

もう1つの方法は新たなパッケージを追加する方法である。新たに追加したパッケージに依存元が参照しているクラスを移動させることで循環が断たれる。