2017-02-28 64 views
0

我做了以下內容:爲什麼只需要在構造函數中進行初始化就需要顯式的Initialize方法?

var vm = scope.CreateInstance<IBlaBla>(); 

vm.SetTitles("bla"); //anti pattern 
vm.Initialize(foo, bar); 

我被告知,上面的是一個反模式,因爲我從來沒有調用初始化方法之前調用其他方法。因此,解決方案是將另一個參數傳遞給Initialize方法,並使該方法執行SetTitles的工作。

我可以看到這背後的邏輯,因爲你想確保虛擬機在做任何事情之前被正確初始化。但是當我們創建VM的新實例時,爲什麼不能完成初始化工作呢?我不明白需要一個明確的Initialize方法。這何時會成爲優勢?

+2

因爲當您設置了標題時vm的狀態是未初始化的,並且您的更改可能會在initialize方法內被重寫。如果你的settitles方法是vm初始化的一部分,爲什麼你不用單一方法做所有初始化? – VikciaR

+0

@VikciaR好吧,我明白了,但爲什麼不在創建虛擬機實例時初始化狀態? – DSF

+0

從字典中:* initialize:設置爲該值或放入適合操作開始的條件*。因此,在您的操作開始時隨時隨地撥打該號碼可能會引起混淆。 – DavidG

回答

1

如果你真的想確保視圖模型是總是做任何事的,你應該考慮它的構造私人和提供兩個創建它的一個實例的工廠方法之前正確初始化初始化:

public class ViewModel 
{ 
    private ViewModel(string title) 
    { 
     Title = title; 
    } 

    public string Title { get; private set; } 

    public static ViewModel CreateAndInitialize(string title) 
    { 
     return new ViewModel(title); 
    } 
} 

那麼你將永遠有一個屬性初始化實例:

ViewModel vm = ViewModel.CreateAndInitialize("..."); 

如果視圖模型是異步初始化這種做法尤其有用:

public static async Task<ViewModel> CreateAndInitializeAsync(string title) 
{ 
    await Task.Delay(2000); //do some init work... 
    return new ViewModel(title); 
} 

ViewModel vm = await ViewModel.CreateAndInitializeAsync("..."); 

否則你可能通常做初始化的視圖模型的構造函數,然後你不需要任何Initialize方法可言。

+1

'靜態ViewModel Initialize'是一個工廠模式不是一個初始化程序,所以應該被稱爲創建不初始化 – MikeT

+0

或CreateAndInitialize如果你打算總是返回一個初始化的實例。我爲了澄清而更改了名稱。 – mm8

+0

如果你想在initialize方法中使用任何服務,該怎麼辦? – MistyK

0

你的問題「爲什麼創建虛擬機的新實例時不能完成初始化?」

讓我們假設一個VM聲明

var vm = new VM(){ 
    prop1 = "foo", 
    prop2 = "bar" 
}; 
vm.Initialise(); 

現在正在這裏

  1. 發生施工
  2. 配置
  3. 初始化

這意味着,如果你初始化INSI德構造配置不能發生

保持初始化從施工獨立也更容易爲設計者支持,因爲它可以創建反射是沒有的功能,因此不太可能,因爲依賴

這是崩潰的對象也爲什麼設計器支持需要空的構造函數

相關問題