最佳實踐我有一個訂單對象,訂單對象包含存儲關於誰下達訂單的人的有關信息Person對象。當我填充Order對象時,我應該填充Person對象嗎?或者,我會關閉主叫order.GetPerson()每當我需要訪問到誰下訂單的人更好。C#中的對象初始化
回答
您可以考慮LazyLoading
方法。以便在需要時它的人的數據將被取出,並裝載(查詢首次)
延遲加載是在計算機編程 中通常使用的設計圖案推遲對象的初始化,直到在該點它 需要
如果資源是一個問題,那麼Shyju的回答是有道理的。否則,如果您始終知道與訂單相關聯的人,那麼填充它。此外,這是一個好主意,使對象不可改變儘可能多的,你也許可以在這種情況下,即通過構造函數傳遞人員,並且永不改變它。
是一個
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
對象的所有用戶更直觀。
正如Chris Sinclair的評論所指出的那樣,它的確歸結於您的設計並考慮了您需要多久才能使用Person對象。如果幾乎每次載入訂單時,都需要關聯的人員(用於顯示或計算等),那麼始終加載人員來限制數據庫調用的數量是有意義的。如果您幾乎不需要Person數據,那麼以後期綁定/延遲加載方式獲取Person數據更有意義。
考慮這個例子。您檢索所有訂單以在網格中顯示它們。但是,當您填充網格時,您還需要顯示每個訂單的人員信息。如果您在每個訂單中加載人員數據,則只需循環訂單,並且您不再需要數據庫調用。如果您使用人員數據的延遲加載,那麼在循環訂單時,您必須爲每個訂單創建額外的數據庫調用以獲取人員數據。這是很多電話。
如果合適,還可以拆分差異和設計加載方法,以便將「LoadChildren」標誌傳遞給該方法。這樣做可以爲您提供最大的靈活性,但可維護性/可讀性會犧牲,因爲根據您在代碼中的位置,您不一定知道Person數據是否已填充。
- 1. C#初始化對象
- 2. C#初始化對象
- 3. C++對象初始化
- 4. c中的對象重新初始化#
- 5. 在C++中初始化對象
- 6. 初始化父對象後初始化相關的對象
- 7. 對象初始化
- 8. 對象初始化
- 9. 初始化對象
- 10. 初始化對象
- 11. Python的C-API對象初始化
- 12. C++堆對象的初始化
- 13. C++中的對象初始化和對象工廠
- 14. 的Java初始化對象
- 15. LINQ的初始化對象
- 16. C++初始化類成員對象
- 17. C#3.0 - 對象初始化程序
- 18. C++ - 如何重複初始化對象?
- 19. 調試C#對象初始化程序
- 20. 對象初始化沒有「新」C++
- 21. C#對象初始化程序
- 22. C#對象初始化選項
- 23. 初始化對象數據成員C++
- 24. const void *對象初始化問題C++
- 25. 初始化對象在C#()或無
- 26. 在飛行對象初始化C++
- 27. 在ASP.NET Core中使用DI初始化初始化對象的對象
- 28. 在初始化中實例化對象?
- 29. 在初始化列表中初始化引用對象成員
- 30. Java對象初始化
假設它取決於設計。如果一個'Order'要求它總是有一個非空的Person,(編輯:它以後不會被賦予新的人員),那麼通過它的構造函數傳遞它並驗證爲非null是通常的一個開始的好地方。 – 2012-07-11 19:22:37
最後一句如何與你的問題的其餘部分一致? 'order.GetPerson()'表明'order.Person'屬性已經被設置(這就是你的問題似乎是關於什麼的)。 – stakx 2012-07-11 19:22:41
對不起,我感到困惑。我的意思是當order.GetPerson()第一次被調用時,它會嘗試從數據庫中檢索個人信息,初始化並返回person對象。 – user1295450 2012-07-11 19:32:08