Berikut adalah skenario umum yang selalu membuat saya frustrasi untuk berurusan.
Saya memiliki model objek dengan objek induk. Induk berisi beberapa objek anak. Sesuatu seperti ini.
public class Zoo
{
public List<Animal> Animals { get; set; }
public bool IsDirty { get; set; }
}
Setiap objek anak memiliki berbagai data dan metode
public class Animal
{
public string Name { get; set; }
public int Age { get; set; }
public void MakeMess()
{
...
}
}
Ketika anak berubah, dalam hal ini ketika metode MakeMess dipanggil, beberapa nilai dalam orangtua perlu diperbarui. Katakanlah ketika ambang Hewan tertentu telah membuat kekacauan, maka bendera IsDirty Kebun Binatang perlu ditetapkan.
Ada beberapa cara untuk menangani skenario ini (yang saya tahu).
1) Setiap Hewan dapat memiliki referensi Kebun Binatang induk untuk mengkomunikasikan perubahan.
public class Animal
{
public Zoo Parent { get; set; }
...
public void MakeMess()
{
Parent.OnAnimalMadeMess();
}
}
Ini terasa seperti pilihan terburuk karena ia memasangkan Animal ke objek induknya. Bagaimana jika saya menginginkan binatang yang tinggal di rumah?
2) Pilihan lain, jika Anda menggunakan bahasa yang mendukung acara (seperti C #) adalah membuat orang tua berlangganan untuk mengubah acara.
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)
{
...
}
}
Ini tampaknya berhasil tetapi dari pengalaman semakin sulit untuk dipertahankan. Jika Hewan pernah mengubah Kebun Binatang, Anda harus berhenti berlangganan acara di Kebun Binatang lama dan berlangganan di Kebun Binatang baru. Ini hanya menjadi lebih buruk karena pohon komposisi semakin dalam.
3) Pilihan lainnya adalah memindahkan logika ke induk.
public class Zoo
{
public void AnimalMakesMess(Animal animal)
{
...
}
}
Ini tampaknya sangat tidak wajar dan menyebabkan duplikasi logika. Misalnya, jika saya memiliki objek House yang tidak membagikan warisan pewarisan bersama dengan Zoo ..
public class House
{
// Now I have to duplicate this logic
public void AnimalMakesMess(Animal animal)
{
...
}
}
Saya belum menemukan strategi yang baik untuk menghadapi situasi ini. Apa lagi yang tersedia? Bagaimana ini bisa dibuat lebih sederhana?