依賴倒置原則
Dependency Inversion Principle 簡(jiǎn)稱DIP。
什么是依賴倒置原則
1.高層模塊不應(yīng)該依賴于低層模塊,二者都應(yīng)該依賴于抽象。
2.抽象不應(yīng)該依賴于細(xì)節(jié),細(xì)節(jié)應(yīng)該依賴于抽象。
每個(gè)邏輯的實(shí)現(xiàn)都是由原子邏輯組成的,不可分割的原子邏輯就是低層模塊,原子邏輯的再組裝就是高層模塊。
抽象指抽象類,細(xì)節(jié)指實(shí)現(xiàn)類。
依賴倒置原則的優(yōu)點(diǎn)
- 減少類間的耦合性
- 提高系統(tǒng)的穩(wěn)定性
- 降低并行開發(fā)引起的風(fēng)險(xiǎn)
- 提高代碼的可讀性和可維護(hù)性
如何做到依賴倒置原則
- 每個(gè)類盡量都有接口和抽象類,或兩者都有。
- 變量的表面類型盡量是接口或者抽象類。
- 任何類都不應(yīng)該從具體類派生。
- 盡量不要覆寫基類的方法。
- 結(jié)合里氏替換原則使用。
代碼舉例
在JavaScript里,依賴倒置原則的適用性僅僅限于高層模塊和低層模塊之間的語義耦合,比如,DIP可以根據(jù)需要去增加接口而不是耦合低層模塊定義的隱式接口。
- 改造前,司機(jī)開奔馳車,高層模塊司機(jī)依賴低層模塊奔馳車。這時(shí)添加寶馬車會(huì)發(fā)現(xiàn)司機(jī)沒有開寶馬車的方法,也就是添加了低層模塊需要去改高層模塊。
class Benze {
constructor() {}
run() {
console.log("benze");
}
}
class Driver {
constructor() {}
drive() {
const car = new Benze();
car.run();
}
}
const driver = new Driver();
driver.drive();
- 改造后,通過依賴注入我們可以在不動(dòng)高層模塊的前提下,任意的修改低層模塊。
class Benze {
constructor() {}
run() {
console.log("benze");
}
}
class BMW {
constructor() {}
run() {
console.log("bmw");
}
}
class Driver {
constructor(car) {
this.car;
}
set(car) {
this.car = car;
}
drive() {
this.car.run();
}
}
const driver = new Driver();
driver.set(new BMW());
driver.drive();