2012-06-05 57 views
10

在依賴注入中,我們針對抽象進行編程。避免違反重用抽象原則

根據我的經驗,我可以說應用程序中的大多數抽象與他們的實現有1:1的關係。這違反了重用抽象原則

馬克·西曼在他的一些帖子,我們可以有抽象空對象執行情況,以便建議避免RAP衝突(這從馬克西曼的建議可能是我的推斷。請糾正我,如果我錯了引用馬克在這)。我的問題在於。

  1. 如何做空對象實現?
  2. 可以違反RAP嗎?

回答

16

我個人覺得它有用來劃去的抽象即使有只有一個生產實施。特別是:

  • 即使你只有一個生產實現,你可能有其他實現測試,無論是全面的假貨或動態創建的嘲笑
  • 它的依賴比更清晰的表達在很多情況下取決於具體的類別。例如,具體的類可能會暴露一些其他公衆成員,其中不是依賴,由於各種原因。

你要知道,這是一個虛假陳述入手:

在依賴注入,我們對編程抽象。

您可以非常容易地使用具體類的依賴注入。有沒有什麼可以說你爲你的依賴創建接口。依賴注入更多的是關於你的類如何獲得的依賴關係,而不是它用來表示它們的抽象級別。

所以基本上:

  • 不要小看「測試雙打」的實施抽象的重要性,即使你只有一個生產實施
  • 不要害怕依賴於具體的實現如果你真的想要,但注入依賴關係仍然比在類中創建它更乾淨,那麼它確實是一個「適當的」依賴關係
  • 不要試圖注入所有內容 - 如果依賴關係的行爲isn'真的是一個英寸那麼你可能不想注入它。例如,不要開始注入「收集提供者」,以避免創建List<T>的實例 - 例如,您不需要爲了測試目的而將您的類與List<T>的行爲隔離開來。
+2

測試! 98%的測試是讓我在課堂上抽象出的東西。而嘲笑/假人確保至少有兩個「實現」。儘管如此,仍然感到很奇怪我不明白你關於「互動」的最後一點。什麼是互動,什麼是互動? – stmax

+0

+1測試也是實現計數的兩倍 –

+0

@stmax:我意識到我沒有解釋得非常好 - 很難指出差異。如果感覺像一些描述(包括文件系統等)的* service *,那麼感覺就像一個交互。如果它只是一個「沒有複雜行爲的數據容器」,我們需要忽略測試(例如集合),那麼通常不需要注入它。 –