İşte başa çıkmam için her zaman sinir bozucu olan ortak bir senaryo.
Üst nesneye sahip bir nesne modelim var. Ebeveyn bazı alt nesneler içeriyor. Bunun gibi bir şey.
public class Zoo
{
public List<Animal> Animals { get; set; }
public bool IsDirty { get; set; }
}
Her alt nesnenin çeşitli veri ve yöntemleri vardır.
public class Animal
{
public string Name { get; set; }
public int Age { get; set; }
public void MakeMess()
{
...
}
}
Çocuk değiştiğinde, bu durumda MakeMess yöntemi çağrıldığında, üst öğedeki bazı değerlerin güncellenmesi gerekir. Diyelim ki, belirli bir Hayvan eşiği bir karmaşa yaptığında, hayvanat bahçesinin IsDirty bayrağının ayarlanması gerekiyor.
Bu senaryo ile başa çıkmanın birkaç yolu var (bildiğim kadarıyla).
1) Her Hayvan, değişiklikleri iletmek için bir hayvanat bahçesi referansına sahip olabilir.
public class Animal
{
public Zoo Parent { get; set; }
...
public void MakeMess()
{
Parent.OnAnimalMadeMess();
}
}
Bu, Animal'ı üst nesnesine bağladığı için en kötü seçenek gibi geliyor. Ya bir evde yaşayan bir hayvanı istersem?
2) Başka bir seçenek, etkinlikleri destekleyen bir dil kullanıyorsanız (C # gibi) ebeveynin etkinlikleri değiştirmek için abone olmasını sağlamaktır.
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)
{
...
}
}
Bu iş gibi görünüyor ama deneyimlerden elde etmek zorlaşıyor. Hayvanlar, Hayvanat Bahçesini değiştirirse, eski Hayvanat Bahçesindeki etkinlikleri iptal etmeli ve yeni Hayvanat Bahçesinde yeniden abone olmalısınız. Bu sadece kompozisyon ağacı derinleştikçe kötüleşir.
3) Diğer seçenek, mantığı üste taşımaktır.
public class Zoo
{
public void AnimalMakesMess(Animal animal)
{
...
}
}
Bu çok doğal görünmüyor ve mantığın tekrarlanmasına neden oluyor. Örneğin, herhangi bir miras ebeveyni Zoo ile paylaşmayan bir House nesnesi olsaydı ..
public class House
{
// Now I have to duplicate this logic
public void AnimalMakesMess(Animal animal)
{
...
}
}
Bu durumlarla baş etmek için henüz iyi bir strateji bulamadım. Başka ne var? Bu nasıl daha basit hale getirilebilir?