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
。
您認爲如何?我是否忘記了一些要點?
爲什麼地球上你會標記一些不變的東西然後改變它?無論「看到可變性在哪裏」,當然,你打算改變的東西都不應該被標記爲不變的,也不應該包含這些東西的任何東西。談論等待發生的錯誤,而不是溝通意圖! 「嘿,這件事說它是不可變的,然後它改變了我,跆拳道?」 – 2010-10-01 01:53:14
@ dash-tom-bang,請你澄清一下嗎?我標記爲不可變,然後改變了什麼? – 2010-10-02 01:00:22
RoomColor被標記爲只讀,但Paint方法更改它。 – 2010-10-03 10:50:37