簡體   English   中英

OOP設計:一個對象依賴於其所有依賴項的存在

[英]OOP design: one object dependent on the existence of ALL its dependencies

請注意,我幾乎沒有接受過有關這種設計理論的正規教育,所以如果我對某些概念不了解,請多多包涵。 我所有的推理都來自C ++背景。 我正在開發用於游戲引擎的基於組件的系統,這是我想出的結構。

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

非常簡單,但讓我們僅關注組件和節點,對於這些組件和節點,我有一套非常嚴格的准則。

  1. 節點可以提供對實體內組件集合的訪問
  2. 一個節點取決於其所有基礎組件的存在
  3. 一個組件可以獨立於指向它的任何節點而存在。
  4. 系統只能訪問節點並對其進行操作

現在,這些節點和組件中的任何一個都可以隨時銷毀。 我通過使用一組侵入列表來維護跨節點迭代的非所有權方法,從而為節點實現了此功能,然后它們在被銷毀時自動從列表中刪除。 但是現在我有一個關於組件的問題。 在銷毀某個組件時,還必須銷毀依賴於該組件的所有節點。 通常,對一個在銷毀另一個銷毀對象時需要銷毀的對象的簡單解決方法是所有權,您可以在其中將節點簡單地放置在組件中,或者在該組件析構函數中動態銷毀它,但是這里的節點可以引用多個不同的組件。 當一個對象具有多個所有者時,通常,像智能指針這樣的引用計數解決方案將所有權歸所有這些對象,並在銷毀所有所有者時銷毀它們,但是這次不是這種情況。 我的大問題是,當我擁有一個僅當其所有依賴項都存在時才存在的對象時,我該如何處理所有權,並且一旦任何依賴項被破壞,該對象就會被破壞。

例:

紅色是存在第二個節點所需的組件

銷毀所依賴的任何組件后的外觀

顯然,有多種不干凈的解決方案,它們具有弱指針,手動刪除和對對象是否存在的大量檢查,但是像所有問題一樣,我想知道是否可以僅通過設計安全地實現。 同樣,如果這是一個非常簡單或眾所周知的概念,請給我指出正確的方向。

@Jorgen G Valley-所有對象的確是該實體擁有的,因為所有對象都在包含實體的破壞時被破壞,但是節點,組件,系統和實體應該能夠隨時動態添加或刪除。 。 這是一個例子。 從世界實體開始,該世界實體包含一個網格和兩個向量的實體。 這兩個向量是獨立更新的,但是假設您想將它們作為父對象,只需添加一個節點,將一個向量指定為父向量,然后將任意數量的向量指定為子向量。 將節點添加到實體會將其置於非所有者列表中,從而允許先前存在的“父”系統迭代所有“父”節點並在每個父節點上執行功能。 取消對象的非公開僅涉及刪除節點,但是矢量和網格仍然應該存在。 假設您只想破壞該向量並保留網格以供其他模型使用,那么破壞該向量也應該破壞父節點,因為它不再引用有效向量。

這里是一些視覺效果:

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

現在是刪除父節點的示例。 這里

請注意,該組件會停留在周圍,因為它可以在其他節點中使用,例如在此示例中,渲染節點正在使用它。 節點的銷毀彌補了父系統使用的入侵列表中的空白,這意味着父系統僅管理擁有父節點的任何其他實體。

現在是刪除矢量分量的示例。 這里

在這種情況下,還必須刪除所有依賴於該矢量的節點,包括父節點和渲染節點。 銷毀消除了那些入侵列表中的空白,系統繼續前進。 希望這有助於說明我要實現的設計。

我認為您使事情變得復雜了很多。 您說節點和組件可以隨時銷毀。 這是真的嗎?

在您的文字中,您將實體描述為所有者,因為您說它包含組件,節點和系統。

我的解決方法是,僅當擁有該組件的實體被銷毀時,該組件才會被銷毀。 這意味着節點,組件和系統無需擔心破壞。 它是由擁有對象(實體)完成的。

編輯:如果您遇到的情況是組件,節點或系統可以被銷毀,而上層實體不被銷毀,我很想聽聽一個例子。 本身就是一個非常有趣的問題。 :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM