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