软件设计原则(五)接口隔离原则 -Interface Segregation Principle
在講接口隔離原則之前,先明確一下我們的主角——接口。接口分為兩種:
◇ 實(shí)例接口(Object Interface),在Java中聲明一個類,然后用new關(guān)鍵字產(chǎn)生的一個實(shí)例,它是對一個類型的事物的描述,這是一種接口,比如你定義Person這個類,然后使用Person zhangSan = new Person()產(chǎn)生了一個實(shí)例,這個實(shí)例要遵從的標(biāo)準(zhǔn)就是Person這個類,Person類就是zhangSan的接口,疑惑?看不懂?不要緊,那是因?yàn)樽孞ava語言浸染的時間太長了,只要知道從這個角度來看,Java中的類也是一種接口;?
◇ 類接口(Class Interface),Java中經(jīng)常使用的interface關(guān)鍵字定義的接口。?
??????? 主角已經(jīng)定義清楚了,那什么是隔離呢?它有兩種定義,如下所示:?
◇ “Clients should not be forced to depend upon interfaces that they don't use”——客戶端不應(yīng)該依賴它不需用的接口。?
◇ “The dependency of one class to another one should depend on the smallest possible interface”——類間的依賴關(guān)系應(yīng)該建立在最小的接口上。?
??????? 新事物的定義一般都比較難理解,晦澀難懂是正常的。我們把這兩個定義剖析一下,先說第一種定義:“客戶端不應(yīng)該依賴它不需要接口”,那依賴什么?依賴它需要的接口,客戶端需要什么接口就提供什么接口,把不需要的接口剔除掉,那就需要對接口進(jìn)行細(xì)化,保證其純潔性;再看第二個定義:“類間的依賴關(guān)系應(yīng)該建立在最小的接口上”,它要求是最小的接口,也是要求接口細(xì)化,接口純潔,與第一個定義如出一轍,只是一個事物的兩種不同描述。?
?????? 我們可以把這兩個定義概括為一句話:建立單一接口,不要建立臃腫龐大的接口。再通俗一點(diǎn)講:接口盡量細(xì)化,同時接口中的方法盡量少。看到這里大家有可能要疑惑了,這與單一職責(zé)原則不是相同的嗎?錯,接口隔離原則與單一職責(zé)的審視角度是不相同的,單一職責(zé)要求的是類和接口職責(zé)單一,注重的是職責(zé),這是業(yè)務(wù)邏輯上的劃分,而接口隔離原則要求接口的方法盡量少。例如一個接口的職責(zé)可能包含10個方法,這10個方法都放在一個接口中,并且提供給多個模塊訪問,各個模塊按照規(guī)定的權(quán)限來訪問,在系統(tǒng)外通過文檔約束“不使用的方法不要訪問”,按照單一職責(zé)原則是允許的,按照接口隔離原則是不允許的,因?yàn)樗蟆氨M量使用多個專門的接口”,專門的接口指什么?就是指提供給每個模塊都應(yīng)該是單一接口,提供給幾個模塊就應(yīng)該有幾個接口,而不是建立一個龐大的臃腫的接口,容納所有的客戶端訪問。
Interface Segregation Principle:
Clients should not be forced to depend upon interfaces that they don't use.——客戶端只依賴于它所需要的接口;它需要什么接口就提供什么接口,把不需要的接口剔除掉。
The dependency of one class to another one should depend on the smallest possible interface.——類間的依賴關(guān)系應(yīng)建立在最小的接口上。
即,接口盡量細(xì)化,接口中的方法盡量少
問題由來:
??????? 類A通過接口I依賴類B,類C通過接口I依賴類D,如果接口I對于類A和類B來說不是最小接口,則類B和類D必須去實(shí)現(xiàn)他們不需要的方法。
解決方案:
??????? 將臃腫的接口I拆分為獨(dú)立的幾個接口,類A和類C分別與他們需要的接口建立依賴關(guān)系。包含4層含義:
??????? 1)接口要盡量小
??????? 不能出現(xiàn)Fat Interface;但是要有限度,首先不能違反單一職責(zé)原則(不能一個接口對應(yīng)半個職責(zé))。
??????? 2)接口要高內(nèi)聚
??????? 在接口中盡量少公布public方法。
?????? 接口是對外的承諾,承諾越少對系統(tǒng)的開發(fā)越有利。
?????? 3)定制服務(wù)
?????? 只提供訪問者需要的方法。例如,為管理員提供IComplexSearcher接口,為公網(wǎng)提供ISimpleSearcher接口。
?????? 4)接口的設(shè)計(jì)是有限度的
建議:
- 一個接口只服務(wù)于一個子模塊或業(yè)務(wù)邏輯;
- 通過業(yè)務(wù)邏輯壓縮接口中的public方法;
- 已被污染了的接口,盡量去修改;若變更的風(fēng)險較大,則采用適配器模式轉(zhuǎn)化處理;
- 拒絕盲從
與單一職責(zé)原則的區(qū)別:
??????? 二者審視角度不同;
??????? 單一職責(zé)原則要求的是類和接口職責(zé)單一,注重的是職責(zé),這是業(yè)務(wù)邏輯上的劃分;
??????? 接口隔離原則要求接口的方法盡量少。。。
總結(jié)
以上是生活随笔為你收集整理的软件设计原则(五)接口隔离原则 -Interface Segregation Principle的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软件设计原则(四)依赖倒置原则 -Dep
- 下一篇: 软件设计原则(六)迪米特法则 -Law