2010-10-01 63 views
0

在部分可變類中,將可變字段與不可變字段混合,還是創建一個封裝它們的新類(或多個類)會更好?下面是我在說什麼在C#中的例子:混合與分離類可變性

interface IBedroom 
{ 
    int Volume { get; } 

    string Color { get; } 

    void Paint(string newColor); 
} 

這裏是在其領域混合可變性的實現:

class MixedMutabilityBedroom : IBedroom 
{ 
    readonly int volume; 
    string color; 

    public MixedMutabilityBedroom(int volume, string color = "") 
    { 
     this.volume = volume; 
     this.color = color; 
    } 

    public int Volume 
    { 
     get { return volume; } 
    } 

    public string Color 
    { 
     get { return color; } 
    } 

    public void Paint(string newColor) 
    { 
     color = newColor; 
    } 
} 

而一個具有獨立的可變性:

// first, a fully mutable helper class 
class RoomColor 
{ 
    string value; 

    public RoomColor(string value) 
    { 
     this.value = value; 
    } 

    public string Value 
    { 
     get { return value; } 
    } 

    public void Change(string newValue) 
    { 
     value = newValue; 
    } 
} 

和分離可變性實現:

class SeparatedMutabilityBedroom : IBedroom 
{ 
    readonly int volume; 
    readonly RoomColor color; 

    public SeparatedMutabilityBedroom(int volume, RoomColor color) 
    { 
     this.volume = volume; 
     this.color = color; 
    } 

    public int Volume 
    { 
     get { return volume; } 
    } 

    public string Color 
    { 
     get { return color.Value; } 
    } 

    public void Paint(string newColor) 
    { 
     color.Change(newColor); 
    } 
} 

我個人以後者的風格。根據我的經驗,在併發場景中由狀態操作產生的錯誤很難調試。隨着併發性成爲程序的常態,似乎本地化可變性是減少調試工作的關鍵因素。在第二個例子中,我們不必查看整個類的實現,找出狀態被操縱的地方。整個SeparatedMutabilityBedroom的可變性被本地化爲RoomColor

您認爲如何?我是否忘記了一些要點?

+0

爲什麼地球上你會標記一些不變的東西然後改變它?無論「看到可變性在哪裏」,當然,你打算改變的東西都不應該被標記爲不變的,也不應該包含這些東西的任何東西。談論等待發生的錯誤,而不是溝通意圖! 「嘿,這件事說它是不可變的,然後它改變了我,跆拳道?」 – 2010-10-01 01:53:14

+0

@ dash-tom-bang,請你澄清一下嗎?我標記爲不可變,然後改變了什麼? – 2010-10-02 01:00:22

+0

RoomColor被標記爲只讀,但Paint方法更改它。 – 2010-10-03 10:50:37

回答

0

使用不可變數據結構編程是一種非常有用的技術,但很難根據一個簡單示例對整體最佳實踐或建議進行評論。決定什麼是最好的,必須考慮到其他因素,例如這個類如何被使用和相互作用。

但是,假設您處於一個與多個寫入者併發的大量併發的情況下,那麼使對象部分不可變則真的不會給您購買太多,因爲您仍然可能遇到問題。

在這種情況下,使用某種同步原語或使用完全不可變的對象。

這個answer談論一些使用完全不可變對象的技術。