2013-08-25 61 views
3

的DIP狀態:開放/封閉原則和依賴倒置原則有什麼區別?

  • 高層模塊不應該依賴於低級別的模塊。兩者都應該依賴於抽象。
  • 抽象不應該依賴細節。細節應該取決於抽象。

而OCP狀態:

軟件實體(類,模塊,函數等)應該是開放的 延期,但對修改封閉。

我認爲如果我們滿足DIP,它也會覆蓋OCP,那麼,爲什麼我們將這兩個原則分開?

+0

'OCP'來自'SOLID',它對於實際的體系結構仍然存在爭議。你可以從Jon Skeet的這裏找到一篇不錯的文章http://msmvps.com/blogs/jon_skeet/archive/2013/03/15/the-open-closed-principle-in-review.aspx – Fendy

回答

4

我認爲堅持DIP原則可以更容易遵守OCP原則。但是,一個不保證另一個。

例如,我可以創建一個具有參數爲Base的方法的類。如果base是一個抽象類,那麼我會堅持DIP,因爲我已經將該依賴關係轉換爲調用者。但是,如果該方法的代碼確實是這樣的:

if (base is derived) 
    (derived)base.DoSomethingSpecificToDerived; 
elsif (base is evenMoreDerived) 
    (evenMoreDerived)base.DoSomethingSpecificToEvenMoreDerived; 

那就不是OCP兼容的,因爲我有我每次添加一個新的微分時間進行修改。

這是非常人爲的例子,但你明白了我的觀點。

+2

但是在你的例子中,高(即你的代碼在裏面),取決於低級別的實現(derived,evenMoreDerived),所以你的示例也違反了DIP,我想。 – Masoud

+0

的確如此。但是,我對DIP的理解是,您將依賴關係的控制轉換爲此類所具有的更高級別。正如我所說,這是一個非常人爲的例子。 –

5

DIP告訴你如何組織依賴關係。它不會告訴你何時你完成了特定的接口。

粗略地說,OCP的信息是具有完整但簡約的接口。換句話說,它告訴你當你的你完成了一個接口但它並沒有告訴你如何來實現這個。

在某種意義上,DIP和OCP是正交的。


那麼,爲什麼我們分開這兩條原則?

至於設計模式和命名原則,幾乎所有的人都有一個共同點,即:

  1. 查找內容各不相同,封裝(隱藏)它。

  2. 希望通過繼承進行聚合。

  3. 接口設計。

即使命名的模式和原則,在一定意義上部分重疊,他們會告訴你比上述三個基本原則更具體的東西(在一個更具體的情況)。

0

OCP使依賴類容易消耗。 OCP通過將舊實施與新版本分離來實現異步消費接口。它允許依賴它的事物繼續依賴它,甚至面對其他目的的變化。這樣一個班級從來不需要關心誰在呼喚它。

DIP做了幾件事情。它使得依賴於外部類容易。依賴注入通過鼓勵將創建職責與消費分離來實現對依賴關係的替代。該模式沒有創建要使用的外部依賴關係,而是指出它應該在外部提供。最終,這會鼓勵代碼是冪等的(不改變外部狀態的代碼)。冪等代碼是很好的,因爲它可以被證實只能立即看到。它沒有外部副作用。它非常易於測試,易於理解和閱讀。

相關問題