部分的に変更可能なクラスでは、変更可能なフィールドと不変のフィールドを混在させるか、それらをカプセル化する新しいクラス (または複数のクラス) を作成する方がよいでしょうか? 私が話していることの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
ます。
どう思いますか?考慮事項をいくつか忘れていませんか?