यहां एक सामान्य परिदृश्य है जो मेरे लिए हमेशा निराशाजनक है।
मेरे पास पैरेंट ऑब्जेक्ट के साथ ऑब्जेक्ट मॉडल है। जनक में कुछ बाल वस्तुएं होती हैं। कुछ इस तरह।
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()
{
...
}
}
जब बच्चा बदलता है, तो इस मामले में जब मेकमेस विधि को बुलाया जाता है, तो माता-पिता में कुछ मूल्य को अपडेट करने की आवश्यकता होती है। मान लीजिए कि जब जानवरों की एक निश्चित सीमा ने गड़बड़ कर दी है, तो चिड़ियाघर के IsDirty ध्वज को सेट करने की आवश्यकता है।
इस परिदृश्य को संभालने के कुछ तरीके हैं (जो मुझे पता है)।
1) प्रत्येक पशु में परिवर्तनों को संप्रेषित करने के लिए माता-पिता चिड़ियाघर का संदर्भ हो सकता है।
public class Animal
{
public Zoo Parent { get; set; }
...
public void MakeMess()
{
Parent.OnAnimalMadeMess();
}
}
यह सबसे खराब विकल्प की तरह लगता है क्योंकि यह पशु को अपनी मूल वस्तु से जोड़े रखता है। अगर मुझे एक जानवर चाहिए जो घर में रहता है तो क्या होगा?
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) दूसरा विकल्प तर्क को अभिभावक तक ले जाना है।
public class Zoo
{
public void AnimalMakesMess(Animal animal)
{
...
}
}
यह बहुत ही अस्वाभाविक लगता है और तर्क के दोहराव का कारण बनता है। उदाहरण के लिए, अगर मेरे पास एक हाउस ऑब्जेक्ट था जो चिड़ियाघर के साथ किसी भी सामान्य विरासत माता-पिता को साझा नहीं करता है।
public class House
{
// Now I have to duplicate this logic
public void AnimalMakesMess(Animal animal)
{
...
}
}
मुझे अभी तक इन स्थितियों से निपटने के लिए एक अच्छी रणनीति नहीं मिली है। और क्या उपलब्ध है? इसे सरल कैसे बनाया जा सकता है?