2009-04-30 231 views
1

如果你有一個A類即類B和C的集合體,是它爲更好甲聚合對象

  • 存儲ID,用於B和C
  • 加載和存儲整個對象B和C(編輯,通過參考存儲到對象B/C,即實例化對象B和C相對於存儲的ID爲B和C.
  • 商店的ID和提供的方法來拉方法B和C

我假設這取決於perf性能要求和其他要求,但我只是尋找任何一般的指導方針或想法。

+0

你在說COM聚合嗎? – dirkgently 2009-04-30 17:00:46

+0

「商店」是什麼意思。如果你有對象,你不需要ID,因爲你有實例。這個數據庫相關 – 2009-04-30 17:02:07

回答

3

在內存中運行的典型程序中,對象幾乎總是以引用的形式存儲爲指針,因此您需要存儲B和C的ID,這只是您自己不處理細節,語言隱藏它們來自你。

加載和存儲「整個對象」是一個值得懷疑的概念。我知道你試圖成爲獨立於語言的人,但真正幫助我「獲取」OO的第一件事之一是,幾乎每個對象都應該有一個自己的生命週期。

如果您有對象A「包含」對象B,並且您將對象B的引用傳遞給對象C,則對象A必須知道有關對象C的一些信息,但這完全不正確。釋放對象B的生命週期,使對象A不知道對象C是使OO工作的核心概念之一。

所以,如果這就是你的意思是通過存儲整個對象,那麼不 - 不要這樣做。

數據庫和其他存儲也是如此。即使一個對象負責銷燬另一個對象,它也很少包含其他對象的數據。(雖然我認爲你的意思是說「拉對象B和C」,而不是「方法」),但是能夠從另一個對象傳遞對象的概念也非常有用,並且通常沒有任何問題有一個注意事項:

請記住,一個對象無法控制自身之外發生的事情。它可以傳遞,以半隨機順序調用的方法等。因此,儘可能保持對象的安全性是有幫助的。如果以錯誤的順序調用某個東西,或者傳遞了一個無效變量,或者您發現某種程度上您已經進入了無效狀態,則會提前失敗並失敗LOUD,以便讓錯誤的程序員調用它。

你也想盡可能地讓它進入一個非法的狀態 - 這意味着保持你的對象小而簡單,儘可能使得變量最終,並儘量不要讓參數調用順序很重要的地方太多。

1

這取決於具體情況。如果這些對象留在內存中,那麼讓A包含B和C就更有OO了(並且更容易)。但是,我發現如果對象需要被持久化,它使A更容易和更高效地存儲ID B和C.(如果你需要直接在A而非B和C中的數據,這樣,你就不必拉B和C移出數據庫,文件等)

1

這取決於

如果B和C沉重並且需要花費來構建和加載,那麼推遲加載它們可能是值得的,直到你確定需要它們(Lazy Initialize)爲止。

如果它們很簡單,很輕便,也許你只是想在每次構建它們,你會得到Ids。

2

我傾向於加載和存儲整個對象(及其子對象)作爲我的默認方法。

有時這會導致加載時間過長,內存佔用空間大或者兩者都有。然後,您需要確定是否所有加載的對象實際上已被使用,或者是否有多個已創建且從未被訪問過。

如果使用的所有對象,更具創意的方式,將需要加載一個子集,處理這些,處理它們,然後加載下一個子集,以適應一切到內存中 - 或者乾脆買更多的內存,並使其可到您的應用程序。

如果沒有使用許多對象,最好的方法是在需要時懶惰地加載子對象。