天天看點

ISP接口隔離原則

一、定義

  不應該強迫客戶程式依賴并未使用的方法

二、接口污染

  接口污染,在C#、C++這樣的靜态類型語言中是很常見的。一個接口會被他不需要的方法污染。在接口中假如一個方法隻是為了能給它的一個子類帶來好處。若持續這樣做的話,那麼每次子類需要一個新方法時,這個方法就會加到基類中去。這會進一步污染基類的接口,使它變"胖"。

   此外,每次基類中加入一個方法時,派生類中就必須要實作這個方法(或者定義一個預設實作)。事實上,有一種特定的相關實踐,可以使派生類無需實作這些方法,該實踐的做法就是把這些接口合并為一個基類,并在這個基類中提供接口中方法的退化實作。但這種實作違反了LSP,會帶來維護和重用方面的問題。

三、分離客戶還是分離接口

  如果強迫客戶程式依賴于那些它們不使用的方法,那麼這些客戶程式就面臨着由于這些未使用方法的改變所帶來的變更。這無意中導緻了所有客戶程式之間的耦合。換種說法,如果一個客戶程式依賴于一個含有它不使用的方法的類,但是其他客戶程式卻确實要使用該方法,那麼當其他客戶要求這個類改變時,就會影響到這個客戶程式。我們希望盡可能地避免這種耦合,是以我們希望分離接口。

四、類接口和對象接口

  1.使用"委托"分離接口(擴充卡模式)

  2.使用多重繼承分離接口

五、結論

  類會導緻它們的客戶程式之間産生不正常的并且有害的耦合關系。當一個程式客戶要求該胖類進行一個改動,會影響到所有其它的客戶程式。是以,客戶程式應該僅僅依賴于它們實際調用的方法。通過把胖類的接口分解為多個特定于客戶程式的接口,可以實作這個目标。每個特定于客戶程式的接口僅僅聲明 它的特定客戶或者客戶組調用的那些函數。接着,該胖類就可以繼承所有特定于客戶程式的接口,并實作它們。這就解除了客戶程式和它們沒有調用的方法間的依賴關系,并使客戶程式之間互不依賴。

繼續閱讀