対処するのが常にイライラする一般的なシナリオを次に示します。
親オブジェクトを持つオブジェクトモデルがあります。親には、いくつかの子オブジェクトが含まれます。このようなもの。
public class Zoo
{
public List<Animal> Animals { get; set; }
public bool IsDirty { get; set; }
}
各子オブジェクトにはさまざまなデータとメソッドがあります
public class Animal
{
public string Name { get; set; }
public int Age { get; set; }
public void MakeMess()
{
...
}
}
子が変更されたとき、この場合はMakeMessメソッドが呼び出されたときに、親の値を更新する必要があります。Animalの特定のしきい値が混乱した場合、ZooのIsDirtyフラグを設定する必要があるとします。
このシナリオを処理する方法はいくつかあります(私が知っていることです)。
1)変更を通知するために、各動物は親動物園の参照を持つことができます。
public class Animal
{
public Zoo Parent { get; set; }
...
public void MakeMess()
{
Parent.OnAnimalMadeMess();
}
}
これは、Animalをその親オブジェクトに結合するため、最悪のオプションのように感じます。家に住んでいる動物が欲しいならどうしますか?
2)別のオプションは、イベントをサポートする言語(C#など)を使用している場合、変更イベントに親をサブスクライブさせることです。
public class Animal
{
public event OnMakeMessDelegate OnMakeMess;
public void MakeMess()
{
OnMakeMess();
}
}
public class Zoo
{
...
public void SubscribeToChanges()
{
foreach (var animal in Animals)
{
animal.OnMakeMess += new OnMakeMessDelegate(OnMakeMessHandler);
}
}
public void OnMakeMessHandler(object sender, EventArgs e)
{
...
}
}
これはうまくいくように見えますが、経験から維持するのが難しくなります。動物が動物園を変更する場合は、古い動物園でイベントの登録を解除し、新しい動物園で再登録する必要があります。これは、構成ツリーが深くなるにつれて悪化します。
3)もう1つのオプションは、ロジックを親に移動することです。
public class Zoo
{
public void AnimalMakesMess(Animal animal)
{
...
}
}
これは非常に不自然に思え、ロジックの重複を引き起こします。たとえば、Zooと共通の継承親を共有しないHouseオブジェクトがある場合。
public class House
{
// Now I have to duplicate this logic
public void AnimalMakesMess(Animal animal)
{
...
}
}
これらの状況に対処するための良い戦略はまだ見つかりません。他に何がありますか?どうすれば簡単にできますか?