2010-07-22 55 views
2

在對象中加載數據時是否有任何最佳實踐或指導原則?對象一旦創建就應該加載一個對象中的所有數據?

例如。您正在進行問卷調查。問卷包含問題。問題的數量可以在0-500之間變化。問卷中包含一種稱爲GetAllQuestions()的方法。

這是我的觀點。是否建議創建一個成員變量(假設類型爲Collection<Question>_allQuestions)並在構造函數中填充該變量?代碼:

public class Questionnaire 
{ 
    Collection<Question> _allQuestions; 

    public Questionnaire() 
    { 
    _allQuestions = new Collection<Question>(); 

    LoadAllQuestions(); 
    } 

    public Collection<Question> GetAllQuestions() 
    { 
    return _allQuestions; 
    } 

    private void LoadAllQuestions() 
    { 
    // Some database stuff and fill _allQuestions 
    } 
} 

或者是現在回答所有問題有更好的要求。代碼:

public class Questionnaire 
{ 

    public Questionnaire() 
    { 

    } 

    public Collection<Question> LoadAllQuestions() 
    { 
    // Some database stuff 
    // Create and fill an object with all the questions 
    // return the object 
    } 

} 

在最後一種情況下,我看到一個缺點。如果您將此方法稱爲十次,該怎麼辦?然後對相同的數據訪問數據庫十次。所以在這種情況下,你可以選擇第一種情況。但是如果刪除或添加了一些問題呢?然後列表不一致。

這只是一個例子。當我不知道該怎麼做時,有更多的情況。我什麼時候應該加載什麼數據。

我在想,是否有一些指導方針或最佳實踐何時加載一個對象的數據?

回答

4

你可以同時做。創建對象時不要加載任何東西。第一次請求時加載一次問題,並將它們緩存在一個字段中以備後續請求。

public class Questionnaire 
{ 
    Collection<Question> _allQuestions; 

    public Collection<Question> AllQuestions 
    { 
    get { 
     if (_allQuestions == null) 
     LoadAllQuestions(); 
     return _allQuestions; 
    } 
    } 

    private void LoadAllQuestions() 
    { 
    _allQuestions = new Collection<Question>(); 
    // Some database stuff and fill _allQuestions 
    } 
} 
+0

+1初始加載後進行緩存 – adriaanp 2010-07-22 10:33:12

+0

聲音合乎邏輯。但是當一個問題被刪除,添加或修改時該怎麼辦? – Martijn 2010-07-22 10:34:19

+0

@Martijn - 你能否讓處理刪除,添加和修改問題的代碼在事件發生時引發事件?然後,Quiestionnaire可以觀看該事件並「忘記」它的問題(即_allQuestions = null),以便在下一次請求時重新加載它們。 – IanR 2010-07-22 10:44:58

0

我認爲,這是你必須執行「Lazy Loading」,即只加載信息(在這種情況下的問題),當你真正需要他們的情況。

當你確定加載在構造函數中的問題,更是創下每次創建Questionnaire對象時的數據庫 - 不必要的開銷,如果你不真的要在當時使用的問題。

「規則」(如果它可以被稱爲規則)應該考慮加載數據和它的效用的代價。在某些情況下,您將需要創建所有數據,而在其他情況下則不需要。這將取決於數據 - 這是對衝我知道的賭注,但這就是「真實世界」所能做的。

0

這將取決於您的數據將被加載的頻率以及數據是否將被使用。例如,如果您打算在調查問卷中使用問題,那麼最好加載完整的對象圖表,但我們假設用戶將查看問卷清單,並且只有當他們點擊一個才能看到問題時當你提出問題時,更好地加載這些問題。

0

檢索您需要的數據。實現某種類型的分頁並檢索您需要在當前頁面中顯示的問題。

0

我認爲你很混淆兩個概念。

在構造函數完成時,對象應處於有效的(可用)狀態。然而,這不同於所有數據的使用。

「有效」,簡單來說,可能意味着bascially,「所有屬性返回正確的值」。這可以通過延遲加載來處理,如其他答案中所述。

相關問題