簡體   English   中英

不可變性對非並行應用程序有用嗎?

[英]Is immutability useful on non parallel applications?

我喜歡不變性概念,但有時我想知道,當一個應用程序不是平行的時候,應該避免讓事情變得不可變嗎?

當應用程序不是多線程的時,您不會受到共享狀態問題的困擾,對吧?

或者不變性是像OOP這樣的概念,你要么一直使用? 排除基於使用/性能等因素不應該不可變的情況。

在為自己編寫應用程序時,我遇到了這個問題,這個問題是適度的(可能像1-2k行)。

我喜歡不可變性的優勢,你只需要在創建對象時驗證它一次。 實際上這是一個巨大的獎金。

我喜歡不變性,因為這意味着我不必相信其他人的代碼,不要亂用我希望保持不變的對象。

當您將一個對象傳遞給另一個組件(如List<T> ,您將受到該組件的作用。 將集合作為屬性返回時,這一點尤其重要。

public class Foo { 
  private List<Bar> _barList;
  public ICollection<Bar> BarList { get return _barList; } 
}

沒有什么可以阻止這個類的消費者清除我下面的集合。 即使將返回類型切換到IEnumerable<Bar>也不完全安全。 沒有什么可以阻止一些編寫錯誤的代碼將其轉換回List<T>並調用.Clear()。

但是,如果我真的希望該集合保持一致,我可以將其重寫為followis

public class Foo {
  private ImmutableCollection<Bar> _barList;
  public ImmutableCollection<Bar> BarList { get { return _barList; } }
}

現在我不必相信其他代碼錯誤地使用我的類。 他們不能弄亂它。

不可變性的一個主要好處是不需要跟蹤不可變對象的所有權。 只要有人需要它們,它們就存在,然后當它們不再需要時就消失在虛無之中。 雖然在許多情況下使用垃圾收集器意味着沒有必要編寫處理可變對象所有權的任何明確代碼(最大的例外是實現IDisposable那些),在許多情況下,編寫正確的代碼非常困難。可變狀態沒有一個明確定義的“所有者”。 關於誰擁有可變對象狀態的困惑可能是一個非常頻繁的錯誤來源; 當使用不可變對象(除了少數實現IDisposable )之外,通常可以忽略所有權問題。

另一個需要考慮的問題是,對於對可變對象的語義不可變對象的可變引用或對可變對象的不可變引用的推理要比推斷對可變對象的可變引用要容易得多。 如果有一個對可變對象的可變引用,通常不清楚更新狀態的正確方法是直接改變對象,還是將其狀態復制到新對象,改變它,並更新引用。 在某些情況下,會出現需要每種類型操作的情況(與List<T> ,有時會用更大的數組替換數組,但通常會進行就地更新),但這種方法只有在類型維護時才有效對可疑對象的獨占控制。 對可變類型進行不可變引用(在這種情況下代碼可能通過只讀包裝器將引用公開給需要其狀態的“實時視圖”的其他對象)或者具有對參數的可變引用,該對象是不可變的,或者至少在引用的生命周期內永遠不會發生變異。

暫無
暫無

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

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