2010-12-11 86 views
27

我們基本上都知道Constructor和用戶定義的Initialize()方法之間的區別。初始化()vs構造函數()方法,創建對象時的正確用法

我的問題是關注對象創建的最佳設計實踐。我們可以將所有Initialize()代碼放入Constructor(),反之亦然(將所有預熱代碼移至Initialize方法並從Constructor調用此方法)。

目前,設計一個新類,我在constructor()內部創建任何新的實例,並將其他預熱代碼移動到Initialize()方法中。

您認爲最好的交易點是什麼?

回答

23

我覺得是應該考慮多個方面:

  • 一個構造函數應該在某種程度上,它是處於可用狀態初始化的對象。

  • 構造函數應該只初始化一個對象,而不是執行繁重的工作。

  • 構造函數不應該直接或間接調用虛擬成員或外部代碼。

所以在大多數情況下,不應該需要Initialize方法。

在初始化涉及的不僅僅是將對象置於可用狀態的情況下(例如,需要執行繁重的工作或需要調用虛擬成員或外部對象時),那麼Initialize方法是一個好主意。

+0

好吧。在過去,我還傾向於在構造函數中使用'initialize()'方法,而不是直接實例化對象,就像使用工廠模式一樣。你認爲這是一個相關的考慮因素嗎? – Ray 2017-01-26 18:59:41

3

最近我發現自己在思考這個問題(因此發現了這個問題),雖然我沒有答案,但我想我會分享我的想法。

  • 建設者的理想'應該只設置對象的狀態,即:幾個:

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初始化模塊。所以創建和初始化仍然有所封裝。

+0

+1'傳遞重負荷' - 這對我來說很有意義 – 2014-01-26 03:35:46

相關問題