接口隔離原則
Interface Segregation Principle 簡(jiǎn)稱ISP。
什么是接口隔離原則
1.客戶端不應(yīng)該依賴它不需要的接口;
2.一個(gè)類對(duì)另一個(gè)類的依賴應(yīng)該建立在最小的接口上。
也就是接口盡量細(xì)化,同時(shí)接口中的方法盡量少。它和單一職責(zé)原則的審視角度不同,單一職責(zé)原則要求的是職責(zé)單一,是業(yè)務(wù)邏輯的劃分。而接口隔離原則要求接口的方法盡量少。
如何做到接口隔離原則
- 接口要盡量小
不出現(xiàn)臃腫的接口,但是小是有限度的,根據(jù)接口隔離原則拆分接口時(shí),首先必須滿足單一職責(zé)原則。 - 接口要高內(nèi)聚,提高接口、類、模塊的處理能力,減少對(duì)外的交互。
在接口中盡量少公布public方法,接口是對(duì)外的承諾,承諾地越少對(duì)系統(tǒng)開(kāi)發(fā)越有利,變更的風(fēng)險(xiǎn)也就越少,同時(shí)也有利于降低成本。 - 定制服務(wù)
定制服務(wù)就是單獨(dú)為一個(gè)個(gè)體提供優(yōu)良的服務(wù)。 - 接口設(shè)計(jì)是有限度的
接口的設(shè)計(jì)粒度越小,系統(tǒng)越靈活,這是不爭(zhēng)的事實(shí)。但是,靈活的同時(shí)也帶來(lái)了結(jié)構(gòu)的復(fù)雜化,開(kāi)發(fā)難度增加,可維護(hù)性降低,所以接口設(shè)計(jì)一定要注意適度。
代碼舉例
在Javascript接口可以理解為:
- 一個(gè)對(duì)象聲明的任意一個(gè)操作都包含一個(gè)操作名稱,參數(shù)對(duì)象和操作的返回值。我們稱之為操作符的簽名(signature)。
- 一個(gè)對(duì)象里聲明的所有的操作被稱為這個(gè)對(duì)象的接口(interface)。一個(gè)對(duì)象的接口描繪了所有發(fā)生在這個(gè)對(duì)象上的請(qǐng)求信息。
第二段代碼將goodStudent接口細(xì)分成了三個(gè)接口,如果后來(lái)判定好學(xué)生的標(biāo)準(zhǔn)改變了,也不用去修改接口。但是如果對(duì)所有的結(jié)果都做最小粒度的細(xì)分那就有無(wú)盡的接口了,所以設(shè)計(jì)粒度的問(wèn)題還是要適度。
class Student {
constructor({ study, sport, talent }) {
this.study = study;
this.sport = sport;
this.talent = talent;
}
goodStudent() {
return this.study && this.sport && this.talent;
}
}
class Student {
constructor({ study, sport, talent }) {
this.study = study;
this.sport = sport;
this.talent = talent;
}
goodstudy() {
return this.study;
}
goodSport() {
return this.sport;
}
goodTalent() {
return this.talent;
}
}