依賴反轉原則

物件導向程式設計領域中,依賴反轉原則(Dependency inversion principle, DIP)是指一種特定的解耦(傳統的依賴關係建立在高層次上,而具體的策略設置則應用在低層次的模組上)形式,使得高層次的模組不依賴於低層次的模組的實現細節,依賴關係被顛倒(反轉),從而使得低層次模組依賴於高層次模組的需求抽象。

該原則規定:

  1. 高層次的模組不應該依賴於低層次的模組,兩者都應該依賴於抽象介面
  2. 抽象介面不應該依賴於具體實現。而具體實現則應該依賴於抽象介面。

該原則顛倒了一部分人對於物件導向設計的認識方式。如高層次和低層次對象都應該依賴於相同的抽象介面。[1]

圖1中,高層對象A依賴於底層對象B的實現;圖2中,把高層對象A對底層對象的需求抽象為一個介面A,底層對象B實現了介面A,這就是依賴反轉。

描述

在傳統的應用架構中,低層次的組件設計用於被高層次的組件使用,這一點提供了逐步的構建一個複雜系統的可能。在這種結構下,高層次的組件直接依賴於低層次的組件去實現一些任務。這種對於低層次組件的依賴限制了高層次組件被重用的可行性。

依賴反轉原則的目的是把高層次組件從對低層次組件的依賴中解耦出來,這樣使得重用不同層級的組件實現變得可能。把高層組件和低層組件劃分到不同的包/庫(在這些包/庫中擁有定義了高層組件所必須的行為和服務的介面,並且存在高層組件的包)中的方式促進了這種解耦。由於低層組件是對高層組件介面的具體實現,因此低層組件包的編譯是依賴於高層組件的,這顛倒了傳統的依賴關係。眾多的設計模式,比如外掛程式服務定位器或者依賴反轉,則被用來在執行時把指定的低層組件實現提供給高層組件。

應用依賴反轉原則同樣被認為是應用了配接器模式,例如:高層的類別定義了它自己的配接器介面(高層類所依賴的抽象介面)。被適配的對象同樣依賴於配接器介面的抽象(這是當然的,因為它實現了這個介面),同時它的實現則可以使用它自身所在低層模組的代碼。通過這種方式,高層組件則不依賴於低層組件,因為它(高層組件)僅間接的通過呼叫配接器介面多型方法使用了低層組件,而這些多型方法則是由被適配對象以及它的低層模組所實現的。

另一個例子是枱燈和按鈕的例子頁面存檔備份,存於互聯網檔案館)。

歷史

依賴反轉原則由羅伯特·C·馬丁英語Robert Cecil Martin提出,並且在數篇公開著作中被表述,包括論文《物件導向設計質素標準:對於依賴的分析》[2],以及一篇1996年出現在C++報道中的名為《依賴反轉原則》的文章[3],和《敏捷軟件開發,原則,模式和實踐》,《C#中的敏捷原則,模式和實踐》兩本書。

參見

參照

  1. ^ Freeman, Eric; Freeman, Elisabeth; Kathy, Sierra; Bert, Bates. Hendrickson, Mike , 編. Head First Design Patterns (paperback) 1. O'REILLY. 2004 [2012-06-21]. ISBN 978-0-596-00712-6. (原始內容存檔於2012-08-22) (英語).  |editor1-last=|editor-last=只需其一 (幫助)
  2. ^ Object Oriented Design Quality Metrics: an analysis of dependencies Robert C. Martin, C++ Report, Sept/Oct 1995 (PDF). [2011-07-14]. (原始內容存檔 (PDF)於2011-07-14). 
  3. ^ The Dependency Inversion Principle, Robert C. Martin, C++ Report, May 1996 (PDF). [2012-12-04]. (原始內容存檔 (PDF)於2019-05-13). 

外部連結