2010-10-01 29 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谈论一些使用完全不可变对象的技术。