2011-08-06 226 views
11

我看到很多功能性編程相關主題提到破壞性更新。我知道這是類似於突變的東西,所以我理解更新部分。但是破壞性的部分是什麼?或者我只是過度思考呢?什麼是破壞性更新?

+2

作爲一個例子:破壞性更新將就地排序列表,而非破壞性更新將創建排序副本。破壞性將改變一個數組元素,一個對象屬性......任何作用於原始對象/數據的東西。 –

回答

15

您可能已經過時了一下。可變性就是它的全部;唯一被「銷燬」的是以前的值

假設您正在使用某種搜索樹來存儲值,並且您想要插入一個新的值。發現其中新價值而來的位置後,你有兩個選擇:

  • 有了一個不變的樹,你構建沿新值的位置的路徑新節點到根。子樹不沿着路徑在新的樹中重用,如果你仍然有一個對原始樹的根的引用,你可以同時使用它們和共享的子樹。如果你有很多不同的副本,那麼這樣可以節省空間,不需要額外的努力,當然你也擁有不可變數據結構的所有優點。

  • 使用可變的樹,你附加它所屬的新值,就是這樣;沒有別的東西需要改變。這幾乎總是更快,並且如果你只有一個副本,那麼節省內存分配,但是任何引用「舊」樹的引用現在都有對新內存的引用。原文已被毀壞;它永遠消失了。如果你需要保留原件,你必須花費在之前創建整個的全新副本。

如果「毀滅」,似乎不必要的苛刻的方式來描述一個簡單的就地更新,那麼你可能還不如我爲了已經調試代碼,找出在地球的某個值上花了多少時間正在改變你的背後。

+1

說得好!儘管如此,我並不認爲這是破壞性的。它只是對我來說是多餘的。無論如何,我一直認爲更新是突變。但是我認爲破壞性會給這個術語增加亟需的重點和謹慎。 :-) – Plumenator

+3

@Plumenator:是的。 「更新」都是非常具有前瞻性和樂觀的,但可變性的缺點幾乎總是涉及到*使用的東西,而不是現在的東西。因此,「破壞性更新」這個術語對於平衡事物和清楚表明你們都在穿過橋樑並將它們燒在身後是很好的。 –