Interface segregation principle (ISP) 介面隔離原則
什麼是ISP
介面隔離原則,簡稱ISP(Interface segregation principle),是規範介面的設計原則,ISP告訴我們:用戶不應該被強迫依賴他們不使用的方法,面對龐大複雜的功能介面,應該使用較小的介面來將功能隔離。
在開始之前,我們先簡單介紹一下介面(interface):
介面用來定義屬性及方法,讓別人可以使用。這裡會用到介面的三大重點:
- 實作介面的類別必須實作該介面定義的屬性及方法。
- 宣告為介面後無法使用不在該介面定義的屬性及方法。
- 相較於單一繼承,一個類別可以同時實作多個介面。
需要注意到,TypeScript具有很強的靈活性,允許我們定義可選的屬性及方法,但為了不造成混淆,我們將避免使用這種語法來撰寫。
為什麼要有ISP
假設我們故意違反ISP,將所有系統用到的功能整理起來,設計出一個龐大而多功能的介面(又稱神的介面),導致每個實作該介面的類別都必須強迫實作所有的屬性及方法,即使無法實作也必須假裝有實作(空實作)。而透過該介面操作類別的使用者,不僅會看到很多不需要的功能,而且萬一呼叫的功能是假造的空實作,更是容易發生問題。
從以上的說明不難看出,介面也是需要切分責任的,所以ISP實際上就是介面的SRP 單一職責原則。
如何做到ISP
我們馬上著手創建一個神的介面:
剛好有一個SuperMan實作了這個介面:
SuperMan加入公司後,大家都知道他能力豐富(誰叫介面都告訴我們了),於是紛紛請他幫忙各種工作,這也導致他每天都要一直加班解決同事的問題,最後SuperMan因為受不了而辭職了,這樣他的工作要找誰來做呢?於是人資找了同樣有實作了SuperEmployee的NormalMan來接替SuperMan的工作,但NormalMan表示:
我其實是只會writeCode跟debug的一般工程師啦,因為找不到工程師的職缺所以只好應徵SuperEmployee,你看我其他的能力都是空實作哦~
人資心想,反正我們也缺工程師,不如錄取進來頂一下位子,再慢慢找更合適的人吧,於是NormalMan就被錄取進公司了。
很久之後的某一天,老闆想要擴編行銷團隊,剛好看到了NormalMan有實作SuperEmployee介面,一定又會行銷又會管理,因此就把NormalMan抓去當行銷主管了,NormalMan:……。
要是能重來
SuperEmployee職責太複雜了,我們必須做介面隔離,將職責相近的功能進行分組:
接著使全能的SuperMan分別實作每個類別:
可以看到即使我們的SuperMan一樣什麼都會,但他可以自己決定要用哪一種職責(介面)來展現給大家看,其他人除了這個介面之外,無法知道他的其他能力,這也讓SuperMan免於過勞的風險。
接著看到NormalMan這邊,因為我們將職責(介面)隔離開了,因此他可以做好自己的職責,好好當個工程師。
老闆看到NormalMan只有實作ProgrammerEmployee介面,一眼就知道他只是一般工程師而已,於是打消了請他擔任行銷部門主管的計畫,事情就這樣圓滿落幕了,真是可喜可賀。至於後來SuperMan被抓去當行銷主管又是另外一個故事了……。
總結一下
ISP介面隔離原則可以看做是介面的SRP單一職責原則,兩者都是依照責任來去做重構,但ISP更加強調介面的重要性,透過介面來達到:
- 將用戶不關心的方法透過介面隱藏起來,只提供需要的方法。
- 避免實作功能複雜的龐大介面而導致空實作的發生。
在設計複雜的系統時,透過隔離介面可以讓我們建構出更加穩固的軟體,將來在介紹到設計模式時,也可以看到許多利用介面的特性來操作的模式,因此熟練使用介面將會帶給我們許多幫助。
如果對於我的文章或程式碼有任何問題,歡迎在下方留言指教。
若有幫助到你,也歡迎給文章拍手一下,讓我在寫文章的路上更加進步!