混合対は、クラスの可変性を分離しました
-
26-09-2019 - |
質問
は、部分的に変更可能なクラスでは、その不変のもので変更可能なフィールドを混ぜ、またはそれらをカプセル化する新しいクラス(またはクラス)を作成するために良いですか?ここで私が話しているかの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;
}
}
、別の可変性との1:
// 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
にローカライズされます。
あなたはどう思いますか?私は検討のためにいくつかのポイントを忘れた?
解決
不変のデータ構造を使用したプログラミングは、非常に有用な技術であるが、簡単な例をもとに総合的なベストプラクティスや提案に批判するのは難しいです。何が最善かを決めることは考慮に入れ、そのようなこのクラスは一緒に使用し、相互作用しているかのような他の要因を取る必要があります。
しかし、その後、あなたはまだ問題に実行することができますので、多くのあなたを買う習慣部分的に不変本当にオブジェクトを作り、あなたがこのオブジェクトに複数の作家との並行処理を大量に持っている状況にあると仮定します。
この場合にはいずれかの同期プリミティブのいくつかの並べ替えを使用するか、または完全に不変オブジェクトを使用します。
所属していません StackOverflow