最近我發現自己在思考這個問題(因此發現了這個問題),雖然我沒有答案,但我想我會分享我的想法。
this.member = member;
在我看來,這與國際奧委會,繼承,測試很好地發揮,只是味道不錯。
然而繁重,有時是需要所以我一直試圖做的是:
這意味着抽象是初始化代碼到其他類和傳球,在這通常是可能的,如果繁重是不是真的你的對象的責任,這樣做其實這refactors到更好的代碼。
如果這是不可能的,你需要在使用前初始化你的類的狀態,然後添加一個initialse方法。這確實增加了時間依賴到你的代碼,但是這不一定尤其是在使用IoC容器時,壞事:
說CarEngine
需要DrivingAssistComputer
,而DrivingAssistComputer
需要做重初始化,即加載所有參數,天氣條件檢查,等等。另外需要注意的是,CarEngine
不直接與DrivingAssistComputer
互動,它只是需要它存在,在旁邊做自己的事情。事實上,如果沒有DrivingAssistComputer
在後臺執行任務(在某處更改某個狀態),引擎可能無法正常工作。如果我們使用IoC的則有:
// Without initialise (i.e. initialisation done in computer constructor)
public CarEngine(FuelInjectors injectors, DrivingAssistComputer computer) {
this.injectors = injectors;
// No need to reference computer as we dont really interact with it.
}
...
所以我們在這裏的是一個構造函數的參數標記computer
爲扶養但實際上沒有使用它。因此,這是醜陋的,但讓我們來添加一個初始化方法:
public CarEngine(FuelInjectors injectors, DrivingAssistComputer computer) {
this.injectors = injectors;
// This ofcourse could also be moved to CarEngine.Initialse
computer.Initialise();
}
...
還沒一個有凝聚力的班,但至少我們知道,我們依賴電腦上,即使我們沒有直接與它的構造之外的交互。
另一種選擇ofcourse是有一個CarEngineFactory,做:
CarEngine CreateEngine(FuelInjectors injectors) {
new DrivingAssistComputer().Initialise();
return new CarEngine(injectors);
}
...
不過,我覺得工廠和IOC只是混淆矩陣,所以我會去的第二個選項。
很想聽聽這方面的一些想法。
編輯1: 我錯過了上面的另一個選擇是使用Initialise方法,但將此調用移動到IoC初始化模塊。所以創建和初始化仍然有所封裝。
好吧。在過去,我還傾向於在構造函數中使用'initialize()'方法,而不是直接實例化對象,就像使用工廠模式一樣。你認爲這是一個相關的考慮因素嗎? – Ray 2017-01-26 18:59:41