在一个部分可变类,是它更好地可变字段与它的不可变的混用,或创建封装它们一个新类(或类)?下面是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

你觉得呢?没有忘记几点考虑?

有帮助吗?

解决方案

与不可改变的数据结构编程是一种非常有用的技术,但是很难批评上基于简单的一例的整体的最佳实践或建议。决定如何被使用这个类和与之交互什么是最好的,必须考虑到其它因素,如

但是,假设你是在有大量多作家并发到该对象的情况,然后做一个对象部分不变真的不会多给你买,因为你仍然可以碰到的问题。

在这种情况下,无论是使用某种形式的同步原语的或使用完全不可变的对象。

答案关于使用完全不变对象的一些技术会谈。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top