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);
    }
}

個人的には後者のスタイルを支持します。私の経験では、同時実行シナリオでの状態操作から生じるバグはデバッグが困難です。並行性がプログラムの標準になるにつれて、可変性をローカライズすることがデバッグ作業を削減するための重要な要素になるようです。2 番目の例では、状態が操作されている場所を見つけるために、クラスの実装全体を調べる必要はありません。の可変性全体SeparatedMutabilityBedroomが にローカライズされていRoomColorます。

どう思いますか?考慮事項をいくつか忘れていませんか?

4

1 に答える 1

0

不変データ構造を使用したプログラミングは非常に便利な手法ですが、単純な例に基づいた全体的なベスト プラクティスや提案について批判するのは困難です。最適なものを決定するには、このクラスがどのように使用され、相互作用するかなど、他の要因を考慮する必要があります。

ただし、このオブジェクトに対して複数のライターが大量の同時実行性を持っている状況にあると仮定すると、オブジェクトを部分的に不変にしても、問題が発生する可能性があるため、実際にはあまり役に立ちません。

その場合、ある種の同期プリミティブを使用するか、完全に不変のオブジェクトを使用します。

この回答では、完全に不変のオブジェクトを使用するいくつかの手法について説明しています。

于 2010-10-01T02:08:46.860 に答える