2012-07-11 78 views
0

最佳實踐我有一個訂單對象,訂單對象包含存儲關於誰下達訂單的人的有關信息Person對象。當我填充Order對象時,我應該填充Person對象嗎?或者,我會關閉主叫order.GetPerson()每當我需要訪問到誰下訂單的人更好。C#中的對象初始化

+0

假設它取決於設計。如果一個'Order'要求它總是有一個非空的Person,(編輯:它以後不會被賦予新的人員),那麼通過它的構造函數傳遞它並驗證爲非null是通常的一個開始的好地方。 – 2012-07-11 19:22:37

+1

最後一句如何與你的問題的其餘部分一致? 'order.GetPerson()'表明'order.Person'屬性已經被設置(這就是你的問題似乎是關於什麼的)。 – stakx 2012-07-11 19:22:41

+0

對不起,我感到困惑。我的意思是當order.GetPerson()第一次被調用時,它會嘗試從數據庫中檢索個人信息,初始化並返回person對象。 – user1295450 2012-07-11 19:32:08

回答

2

您可以考慮LazyLoading方法。以便在需要時它的人的數據將被取出,並裝載(查詢首次)

延遲加載是在計算機編程 中通常使用的設計圖案推遲對象的初始化,直到在該點它 需要

0

如果資源是一個問題,那麼Shyju的回答是有道理的。否則,如果您始終知道與訂單相關聯的人,那麼填充它。此外,這是一個好主意,使對象不可改變儘可能多的,你也許可以在這種情況下,即通過構造函數傳遞人員,並且永不改變它。

0

是一個Order對象有效,如果Person屬性沒有設置?

如果order.Person必須設置爲一個Person對象,以便order處於有效狀態,那麼它很可能是你想要的Order構造函數接受Person對象。這是因爲構造函數應該始終構造有效的對象,而不僅僅是部分有效的對象。

public class Order 
{ 
    public Order(Person person) 
    { 
     this.person = person;  
    } 

    public Person Person { get { return person; } } 
    readonly Person person; 
} 

如果,另一方面,order.Person不必爲了Order初始化被認爲有效,那麼你的構造不需要Person參數。相反,你可以做Person可讀寫屬性:

public class Order 
{ 
    public Order() { … } 
    public Person Person { get; set; } 
} 

如果你這樣做,回答以下問題:

是否有意義的Person屬性可以設置幾次,到不同的Person實例?

如果是,那麼上述方法都可以。

不過,我想用「否」的答案:一個訂單隻能由一個單一的Person放置,這不能改變以後。您可以考慮使物業能夠設定一次只,在此,將其設置後續嘗試將觸發異常:

public Person Person 
    { 
     get { return person; } 
     set 
     { 
      if (person != null) throw new InvalidOperationException; 
      person = value; 
     } 
    } 
    Person person; 

......然而,這可能不是很直觀。一個更好的辦法是設置在構造函數中Person屬性,使屬性只讀(如上圖所示)。這可能看起來過於嚴格,但可能對您的Order對象的所有用戶更直觀。

0

正如Chris Sinclair的評論所指出的那樣,它的確歸結於您的設計並考慮了您需要多久才能使用Person對象。如果幾乎每次載入訂單時,都需要關聯的人員(用於顯示或計算等),那麼始終加載人員來限制數據庫調用的數量是有意義的。如果您幾乎不需要Person數據,那麼以後期綁定/延遲加載方式獲取Person數據更有意義。

考慮這個例子。您檢索所有訂單以在網格中顯示它們。但是,當您填充網格時,您還需要顯示每個訂單的人員信息。如果您在每個訂單中加載人員數據,則只需循環訂單,並且您不再需要數據庫調用。如果您使用人員數據的延遲加載,那麼在循環訂單時,您必須爲每個訂單創建額外的數據庫調用以獲取人員數據。這是很多電話。

如果合適,還可以拆分差異和設計加載方法,以便將「LoadChildren」標誌傳遞給該方法。這樣做可以爲您提供最大的靈活性,但可維護性/可讀性會犧牲,因爲根據您在代碼中的位置,您不一定知道Person數據是否已填充。