2014-09-23 62 views
6

我想知道是否有一個「更清潔」的解決方案,使用依賴注入綁定到有很多參數的類,因爲根據Robert C.Martin的Clean Code,最好不要使用超過3個參數...任何其他的解決方案,想法(和例子?)乾淨的代碼 - 依賴注入

+2

當一個類有很多依賴項時,你是否特別指構造函數注入? – David 2014-09-23 13:05:25

+0

可能不會回答你的問題,但我認爲將數組作爲單個參數傳遞是非常乾淨的,實際上它包含許多不同的信息。我已經看到這在JavaScript中做了很多,jQuery是一個典型的例子。不是迪,但它確實清理了很多爭論的問題。 – srayner 2014-09-23 13:09:03

+1

如果你似乎有很多的依賴關係,那麼我會問你的設計是否緊密耦合。 – srayner 2014-09-23 13:10:58

回答

4

我承擔.. 不管你是否使用構造器參數或程序參數,最好避免很多作爲參數傳遞的參數。

即使羅伯特C.馬丁的潔淨代碼說,最好不要超過3,這只是一個指導方針。實際上,這可能會改變,因爲您可能需要超出此限制的原因數量。例如,如果您有多個構造函數,則有些參數會很好地列出,以便API可以被發現 - 這也意味着參數列表永遠不會改變。

但是,在大多數情況下,參數可能會改變和重新分解並且如果您有很長的參數列表會變得更困難,情況並非如此。我使用數組或包含對象,所以更改將只是該對象。

所以首選是使用較少的參數3/4 max,但如果你過度,創建一個可以傳遞的對象。雖然這會滿足大多數情況,但有時您可能必須要有長參數列表IMO。

+0

是否有可能提供一個小例子如何將其設置爲一個對象? – RubenHerman 2014-10-01 06:48:03

+0

我現在所做的是:我創建了一個抽象類,並在該構造函數中使用了Kernel.Get <...>,所以我不必在構造函數中傳遞它們。這是更好的解決方案嗎?我的其他類來自抽象類 – RubenHerman 2014-10-01 08:39:47

+0

在這種情況下,您需要上下文綁定。通常IoC/DI框架假設1個接口= 1個具體類。大多數框架允許多態綁定,但是你不需要它,因爲你可以使用變通解決方案。當你需要同時使用上下文綁定的多個實現可能會導致比尋找替代解決方案更多的bug。 (通過Polymorphic我的意思是不同的實現共存於相同的接口) – GameDeveloper 2014-10-05 19:05:28

4
Dependency Injection != Lot of arguments 

,你要使用的參數數目取決於你的個人代碼設計,用DI你專注於你需要實現的東西的依賴,當然你需要至少那些即使你不依賴用「依賴注入/ IoC模式」來編寫類。如果你有太多的論點,你可能不得不重新考慮你的設計。

如果你懷疑在維護方面想。

「如果我必須改變某些東西,它會在哪裏?如果我做了這樣的改變,那麼改變會觸及多少其他地方?」

有可能的解決方法,只是說幾個:

  1. 裹2個或更多的依賴作爲一種新的依賴(機會是很高,當你需要多依賴的你將不再需要這些依賴的整個API和因此你可以將它的一部分隱藏在一個新的界面之後..)
  2. 由於Spock說你可以創建一個「參數」對象(實現留給你:參數列表或對象結構)。

也取決於你的編程語言,你可能會發現更多有用的某些解決方案,而不是其他人(選項1可能更適合用語言,如C++每個依賴會增加大量的編譯時間,而選項2似乎有可能與PHP等語言一起使用,因爲用戶需要更少的編碼和努力)。