このブログ投稿では、次の動機付けのポスターによって依存関係逆転の原則が説明されました。
ポスターの意味がわかりません:ランプを壁に直接はんだ付けすることは依存関係の逆転の原則にどのように違反し、プラグは依存関係の逆転の原則にどのように従っていますか。おそらく、ランプとコンセントに関する Java または C# のスケルトン コードが役に立つかもしれません。
このブログ投稿では、次の動機付けのポスターによって依存関係逆転の原則が説明されました。
ポスターの意味がわかりません:ランプを壁に直接はんだ付けすることは依存関係の逆転の原則にどのように違反し、プラグは依存関係の逆転の原則にどのように従っていますか。おそらく、ランプとコンセントに関する Java または C# のスケルトン コードが役に立つかもしれません。
あなたのリンクから:
SOLID の「D」は依存性逆転の原則を表しており、高レベルのモジュールは低レベルのモジュールに依存すべきではなく、両方とも共有の抽象化に依存すべきであると述べています。
「共有された」抽象化が何を意味するのかわかりません。コードでは、ランプは「高レベル モジュール」であり、ランプが電源を取得する場所は依存関係、つまり「低レベル モジュール」になります。
あなたの質問:
ランプを壁に直接はんだ付けすると、依存関係の逆転の原則にどのように違反しますか
ポスターのランプは、抽象的な電源に依存していないため、依存性逆転の原則に違反しています。これは、壁の電気配線に直接はんだ付けするという非常に具体的な実装に依存しています。この関係をコードでモデル化すると、次のようになります。
public class Lamp {
// This part is the equivalent of "soldering a lamp directly to the electrical wiring in a wall"
private ElectricalWiringInBobsWall electricalWiring = new ElectricalWiringInBobsWall();
private boolean isOn;
public void turnOn() {
electricalWiring.useElectricityInWatts(60);
isOn = true;
}
public void turnOff() {
electricalWiring.turnOffElectricityInWatts(60);
isOn = false;
}
}
これを行うと、他の状況でランプを使用するのが非常に難しくなります。実生活では、家の別の場所に移動したり、発電機で使用したり、海外に持って行って別のコンセントに接続したりする場合、ランプ自体を大幅に手直しする必要があります。同様に、コード ベースでは、このランプを別の電源で再利用する場合、ランプ自体のコードを変更する必要があり、再テストが必要になるか、新しいバグが発生する可能性があります。
プラグインを持つことはどのように依存関係の逆転の原則に従いますか
コンセントはより抽象的です。ユーザーとして、ランプがどのように電力を得るかを実際に知る必要がないからです。知っておくべきことは、ランプを差し込めば動作するということだけです。コンセントは、電源を抽象化したものです。つまり、力が実際にどこから来ているかの詳細を隠します。壁のコンセント、発電機、海外のアダプター、ソーラーパネル電源などがあります。
上記のクラスで DIP を使用するLamp
と、抽象化に依存し、実装が依存関係として渡されます。コードでは、これは次のようになります。
public interface Outlet {
void useElectricityInWatts(int watts);
void turnOffElectricityInWatts(int watts);
}
public class Lamp {
private Outlet outlet;
private boolean isOn;
// We pass in the dependency instead of instantiating it and rely on an interface (abstraction)
public void plugInto(Outlet outlet) {
this.outlet = outlet;
}
public void turnOn() {
outlet.useElectricityInWatts(60);
isOn = true;
}
public void turnOff() {
outlet.turnOffElectricityInWatts(60);
isOn = false;
}
}
これで、ランプは、BobsOutletInHisWall、GeneratorOutlet、EuropeanAdapterOutlet など、任意のタイプのコンセントを使用できるようになりました。簡単に移動して他の状況で使用することができ、まったく変更する必要はありません。
この例が完全ではないことは承知していますが、ポスターの意味を説明できることを願っています。