2014-02-27 34 views
1

就這樣,我對這種類型的設計理論幾乎沒有接受過正式的教育,所以如果我對某些概念一無所知,請耐心等待。我所有的推理都來自C++的背景。我正在研究基於組件的系統以用於遊戲引擎,而這正是我所提出的結構。面向對象設計:一個對象依賴於它所有的依賴項的存在

  • 有一些組件,它們只是數據。
  • 有些節點允許訪問該數據。
  • 有些系統只能在節點上運行。
  • 有實體,其中包含這些節點,組件,系統和其他實體。

很簡單,但我們只關注組件和節點,我有一套非常嚴格的指導原則。

  1. 一個節點可以在實體內提供進入組件的集合
  2. 一個節點依賴於的存在所有其底層部件
  3. 組件可以存在獨立指向它的任何節點的。
  4. 系統只能在節點

訪問和行爲現在這些節點和組件都可以在任何時間被破壞。我通過使用一組干擾列表來維護一個非所有權方法來遍歷節點,然後在銷燬時自動從列表中刪除自己。但是現在我有一個關於組件的問題。在銷燬某個組件時,所有依賴該組件的節點也必須銷燬。通常,當另一個被銷燬時,簡單修復一個需要銷燬的對象是所有權,您只需將該節點放置在組件中,或者在該組件的析構函數中動態銷燬它,但此處的節點可以引用多個不同的組件。當一個對象擁有多個所有者時,通常像智能指針這樣的ref計數解決方案將所有這些對象的所有權給予所有者,並在所有所有者被銷燬時銷燬,但這次不是這種情況。我的一個大問題是,當我擁有一個只能存在所有存在依賴關係的對象時,以及銷燬任何依賴關係時,我將如何處理所有權,從而導致該依賴對象被破壞。

例如:

Red are components needed for the existence of the second node

What it looks like after either component it depends on is destroyed

顯然,有弱的指針,手動刪除,以及大量的檢查的對象存在多個不乾淨的解決方案,但像所有的問題,我不知道這是否可以通過設計單獨安全地實現。再次,如果這是一個非常簡單或衆所周知的概念,請指出我正確的方向。

@Jorgen G Valley - 所有對象都由實體擁有,因爲所有對象都在銷燬包含實體時銷燬,但是應該能夠添加節點,組件,系統和實體或隨時動態移除。這是一個例子。從世界實體開始,它包含一個網格和兩個向量的實體。這兩個向量是獨立更新的,但假設您想將它們放在一起,您只需添加一個節點,將一個向量指定爲父項,並將任意數量的向量指定爲子項。向實體添加節點將其放入非擁有列表中,允許先前存在的「父」系統遍歷所有「父」節點並在每個父節點上執行功能。解除對象只包括刪除節點,但是矢量和網格應該仍然存在。假設你想破壞這個向量並且保持在另一個模型中使用的網格,那麼該向量的銷燬也應該銷燬父節點,因爲它不再引用有效的向量。

以下是一些視覺效果:

這裏是上述情況的一個例子。 here

現在這裏是一個刪除父節點的例子。 here

注意到組件停留在附近,因爲它可以在其他節點中使用,就像本例中的渲染節點正在使用它。節點的銷燬封閉了父系統使用的侵入列表中的間隙,這意味着父系統只管理其他任何具有父節點的實體。

現在這裏是一個刪除矢量組件的例子。 here

在這種情況下,所有依賴於該向量的節點也必須被刪除,包括父節點和渲染節點。那裏的銷燬彌補了這些侵入列表中的空白,並且系統繼續在那裏。希望這有助於說明我試圖實現的設計。

+0

對我來說就好像設計,「組件從節點的非擁有列表中刪除自己」擴展到「組件銷燬節點」。這是這種情況嗎? –

+0

我可能不應該提到非擁有列表,這只是系統訪問沒有所有權的節點的方式。問題是肯定的,組件會破壞節點,但是由於節點可以引用任意數量的組件。問題變爲:「節點依賴的任何組件破壞節點」這是我的混亂。是否有一種設計不涉及包含弱引用的組件以及手動刪除引用的對象,強制該節點依賴的所有其他組件檢查該節點的存在? (討厭的解決方案)。 – FatalCatharsis

+0

可以銷燬節點的一部分,將其從組件中刪除?其中之一即將死亡,其餘的可能不會。 –

回答

0

我認爲你比你需要更復雜的東西。你說節點和組件可以在任何時候被銷燬。這是真的嗎?

在您的文本中,您將實體描述爲所有者,因爲您聲稱它包含組件,節點和系統。

我的做法是隻有當擁有它的實體被銷燬時纔會銷燬組件。這意味着節點,組件和系統不需要擔心破壞。它由擁有的對象,實體完成。

編輯:如果你有組件,節點或系統可以銷燬而沒有重疊的實體被銷燬的情況,我很感興趣聽到一個例子。這本身就是一個非常有趣的問題。 :)

+0

@Jorgen_G_Valley - 將主要問題的回覆放在更多空間中。 – FatalCatharsis