2010-09-27 87 views
1

我不知道如何更好地描述這一點。所以拿這個例子。參考迴路

var a = { 
    x: 1, 
    y: 2 }; 

var b = { 
    z: 3, 
    refA = a }; 

a.refB = b; 

我有一個偏好,這是種行爲是醜陋的。所以最好的情況是,我對這種編碼有個人不同意見。你不應該需要這些類型的引用,它會導致難以理解的代碼。

但是,有沒有人看到做這些引用的技術懲罰。

+0

你沒有描述這是試圖達到什麼,所以很難給出任何意見。 – Oded 2010-09-27 20:01:57

+1

我沒有看到這樣的設置有什麼問題。並非所有實體關係都可以方便地建模爲非循環圖。 – Pointy 2010-09-27 20:03:09

回答

2

相互引用(你稱之爲引用循環)對於某些數據結構是必需的。許多樹有從父母指向孩子的鏈接,反之亦然;雙鏈表具有prevnext指針。

有沒有特別的原因讓你不喜歡這個?

+0

我不喜歡這個的原因是A中的方法開始從B調用數據結構,反之亦然。所以不是A處理自己和B處理自己,而是彼此攻擊另一個做事情。這使得追查誰在哪裏做什麼非常困難。 – Drew 2010-09-28 16:59:37

+0

不一定。如果使用訪問器和增變器(獲取器和設置器),則可以將A的數據訪問集中到A和B的B。您還可以在設置器中執行檢查以確保數據一致。這是一種非常常見的做事方式;如果你不喜歡它或者覺得它很醜,那麼你不會像程序員那樣開心。 – 2010-09-28 19:06:10

+0

是的,我做了很多,但我正在看的代碼不這樣做。 A正在變異b,而B正在變異A並因此調用函數來變異B.我的父母>孩子的正常做法沒有孩子對父母做事情,所以這個意大利麪條代碼無法使用。 – Drew 2010-09-28 21:12:16

1

Javascript是一種動態語言。你所描述的是,在運行時添加一個屬性,在這種情況下是一個特性。

0

它被稱爲循環引用,在某些方面有必要或無法避免。最好的例子是一本普通的詞典 - 在這裏你用一個詞來解釋一個詞的含義。或鏈接列表。

因此,根據您的使用情況,它可能是好的或邪惡的。

1

我不認爲應該有任何懲罰參考循環。在某些情況下,這也是需要的。對於例如客戶和帳戶對象。在帳戶對象中,您將參考客戶(一個或多個),並且在客戶中您需要參考帳戶(也可以是多個帳戶)

0

沒有性能損失。循環引用只是指向對方,而不是副本。像其他人提到的一樣,有時候需要有循環引用。大多數的heirchical結構使用循環引用來表示父/子關係。有時孩子需要知道父母和父母需要了解孩子。這樣可以很容易地在層次結構中上下走動。