- Live軟件開發面面談
- 潘俊編著
- 790字
- 2019-07-30 17:54:59
1.2 依賴反轉原則
在模塊化或組件化軟件設計中,不同模塊間保持松耦合。每個模塊都定義有清晰的接口,模塊間的調用都通過和限于接口,只要接口不變,模塊內對接口的實現可以自由修改和演化。這個原則就是著名的“針對接口編程,而不是針對實現”(Program to an interface, not an implementation)。針對接口編程比使用接口編程更具雄心、野心和企圖心(More ambitious),它要更徹底地消除依賴關系。1.1節的DeclareAndReturnInterface方法,雖然dict變量聲明為IDictionary接口,但因為初始化為Hashtable類型,該方法所在的類UseInterfaceDemo仍然依賴Hashtable類。要消除此依賴,必須做到模塊之間完全以接口交流。
為了分析依賴和接口的關系,下面介紹最簡單的兩個模塊的情況。應用模塊需要使用工具模塊的功能。按照傳統的設計,應用模塊直接引用工具模塊。兩者的依賴關系如圖1.1所示。

圖1.1 傳統設計中應用模塊和工具模塊的關系
這種緊密的耦合限制了應用模塊的可用性,它只能和特定的工具模塊一同工作,當有更好的或實現其他功能的工具模塊時,它也不能替換以利用。為了打破這個約束,可以將應用模塊需要的工具模塊的功能抽象成一個工具接口,應用模塊通過這個接口來使用工具模塊,工具模塊只要實現這個接口,就能被自由替換。此時假如將工具接口置于應用模塊內,因為工具模塊要引用該接口,兩模塊間的依賴關系發生了奇妙的倒轉,如圖1.2所示。

圖1.2 工具接口置于應用模塊之內時兩模塊之間倒轉的關系
每個工具模塊在開發時都要引用應用模塊,當然是不理想的,尤其作為工具模塊根本無法知道要使用它們的應用模塊可能是什么樣的,所以這樣反過來的依賴也必須消除。辦法就是令工具接口脫離應用模塊,成為一個新的獨立模塊。這樣應用模塊和工具模塊都僅僅引用這個抽象的接口模塊。三者的關系如圖1.3所示。

圖1.3 工具接口獨立于應用模塊和工具模塊時三者的關系
這個最終方案可以用一句話來概括:調用模塊不應該依賴被調用模塊,兩者應該依賴抽象出的接口。這個原則被稱為依賴反轉(dependency inversion),雖然它不是顧名思義地指上面第二種情況。