依存性逆転の原則とは?
オブジェクト指向設計の原則

「依存性逆転の原則」とは?

「依存性逆転の原則」(Dependency inversion principle)とは、オブジェクト指向プログラミングにおける基本的な5つの原則(SOLID原則)の一つである。

A. 上位レベルのモジュールは下位レベルのモジュールに依存すべきではない。両方とも抽象(abstractions)に依存すべきである。
B. 抽象は詳細に依存してはならない。詳細が抽象に依存すべきである。

「上位レベルのモジュールが下位レベルのモジュールに依存する」とは?

例として「上位レベルのモジュール」を「人」クラス、「下位レベルのモジュール」を「フライパン」クラスとしよう。

「人」クラスが「フライパン」クラスを使うように実装した場合、「人」クラスは「フライパン」クラスに依存している。

「フライパン」クラスを「鍋」クラスに変えたければ、「人」クラスの書き換えが必要だからである。

 「抽象に依存する」とは?

「フライパン」クラスの「抽象」である「調理道具」インターフェースを用意する。

「人」クラスは、「フライパン」クラスを使うのではなく「調理道具」インターフェースを使うように変える。

「フライパン」クラスは、「調理道具」インターフェースに従うように実装する。

こうすると「上位レベルのモジュール」も「下位レベルのモジュール」も、インターフェースという「抽象」に依存するようになる。

「人」クラスは外部から「調理道具」インターフェースを受け取るようにしておく。

これで「人」クラスは「調理道具」インターフェースを実装したクラスは何でも使える。

「人」クラスが「フライパン」クラス(「調理道具」インターフェースを実装)を使っていたところ、「鍋」クラス(「調理道具」インターフェースを実装)を使うように変えたい場合、「人」クラスの書き換えが不要になる。

「人」クラスに渡すクラスを変えればいいのだ。

「依存性逆転」とは?

「上位レベルのモジュール」である「人」クラスから、「下位レベルのモジュール」である「フライパン」クラスへの依存はなくなった。

「人」クラスは、同じ「上位レベルのモジュール」である「調理道具」インターフェースに依存するように変わったからである。

「下位レベルのモジュール」である「フライパン」クラスは、「上位レベルのモジュール」である「調理道具」インターフェースに依存するようになった。

「上位レベルのモジュール」が「下位レベルのモジュール」に依存していたところ、「下位レベルのモジュール」が「上位レベルのモジュール」に依存するようになり、「依存性」が「逆転」した。