本篇是SOLID原則的第四部分,建議先閱讀前三部分:
JavaScript 中的 SOLID 原則(一):“S”代表什么
JavaScript 中的 SOLID 原則(二):“O”代表什么
JavaScript 中的 SOLID 原則(三):“L”代表什么
這是SOLID的第四篇文章(原文一共五篇),作者是serhiirubets毕谴,歡迎持續(xù)關注。
接口隔離原則(Interface Segregation Principle)
I - 接口隔離原則更胖。這個原則是指:客戶端不應該依賴他們不使用的接口(接口應該是精簡的,擁有盡可能少的行為)。
這是什么意思? 這個原則是關于接口的择懂,但是在JavaScript中沒有接口,不過有類似的東西另玖,那就是類困曙。雖然兩者不一樣,但是這個原則可以應用到JS類上谦去。
對于JS類來說慷丽,這個原則是指當我們創(chuàng)建一個基礎類,需要在其中定義所有子類都會用到的方法鳄哭,并且避免只有部分子類會用到的方法要糊。舉個簡單的例子,當我們創(chuàng)建一個Transport
的基礎類并添加以下方法:move,stop,fly和sail窃诉。示例中的方法只添加了console.log
杨耙,實際應用中對應的應該是真正的業(yè)務邏輯赤套。
class Transport {
move() {
console.log('move');
}
stop() {
console.log('stop');
}
fly() {
console.log('fly');
}
sail() {
console.log('sail');
}
}
我們再創(chuàng)建三個子類:Plane, Car 和 Ship飘痛。
class Plane extends Transport {
sail() {
return null;
}
}
class Car extends Transport {
fly() {
return null ;
}
sail() {
return null;
}
}
class Ship extends Transport {
fly() {
return null ;
}
}
你可能注意到了,每個子類中重寫了繼承的方法容握,并返回了null
宣脉。為什么這么做呢,拿Plane舉例剔氏,飛機可以fly和move塑猖,但是不能sail(船類航行)。
我們的基類包含了sail邏輯谈跛,但是飛機不能sail羊苟。我們應該做一些事情,因為有人可能會調用plane實例上的sail方法感憾,我們可以拋出錯誤或者像現(xiàn)在一樣重寫sail方法蜡励。其他兩個類也是同樣的處理方式,Car重寫了fly和sail阻桅,ship重寫了fly凉倚。
所以問題在于:我們創(chuàng)建的基類包含的方法,有的子類可以使用嫂沉,但其他的子類不能稽寒。這就是接口隔離原則所指的:我們不應該在基類中創(chuàng)建子類不會使用到的邏輯。
當然趟章,這個和多態(tài)沒有關系杏糙,如果我們創(chuàng)建了一個通用的方法慎王,但是每個子類都會重寫這個方法邏輯,是可以的宏侍。
舉個例子:我們有一個Animal基類柬祠,包含一個breathe方法,它的子類也可以breathe但是使用了不同的方式负芋,我們可以使用多態(tài):
class Animal {
breath() {
console.log('common breath')
}
}
class Human extends Animal {
breath() {
console.log('lung breath')
}
}
class Fish extends Animal {
breath() {
console.log('gills breath')
}
}
再重溫一下接口隔離原則:正確的在基類中創(chuàng)建方法漫蛔,這些方法應該被繼承的子類所使用。
那么我們怎么解決Transport類中的問題呢旧蛾?我們可以創(chuàng)建更具體的子類莽龟,子類中包含只有自身會使用到的方法:
class Transport {
move() {
console.log('move')
}
stop() {
console.log('stop')
}
}
class FlyingTransport extends Transport {
fly() {
console.log('fly')
}
}
class SailingTransport extends Transport {
sail() {
console.log('sail')
}
}
class Car extends Transport {}
class Plane extends FlyingTransport {}
class Ship extends SailingTransport {}
現(xiàn)在我們的Transport基類包含了move和stop兩個方法禁炒,這兩個方法可以用在所有的子類檀夹。我們還創(chuàng)建了兩個具體的子類塑煎,plane可以繼承FlyingTransport具练,輪船可以繼承SailingTransport聂抢。
這就是“SOLID”原則中“I”的含義:這個原則主要的目的是讓代碼擁有良好的層次結構轻腺,盡量不要在基類中創(chuàng)建子類不需要的方法塘慕。
歡迎關注微信公眾號”混沌前端“
推薦閱讀: