मैं एक ऑब्जेक्ट मॉडल विकसित कर रहा हूं जिसमें विभिन्न माता-पिता / बच्चे वर्ग के बहुत सारे हैं। प्रत्येक बाल वस्तु में अपनी मूल वस्तु का संदर्भ होता है। मैं माता-पिता के संदर्भ को शुरू करने के कई तरीकों के बारे में सोच सकता हूं (और कोशिश कर चुका हूं), लेकिन मुझे प्रत्येक दृष्टिकोण में महत्वपूर्ण कमियां हैं। नीचे दिए गए दृष्टिकोणों को देखते हुए जो सबसे अच्छा है ... या जो बेहतर है।
मैं यह सुनिश्चित करने नहीं जा रहा हूं कि नीचे दिए गए कोड कंपाइल हों, इसलिए कृपया मेरा इरादा देखने की कोशिश करें यदि कोड सिंटैक्टिक रूप से सही नहीं है।
ध्यान दें कि मेरे कुछ चाइल्ड क्लास कंस्ट्रक्टर पैरामीटर (माता-पिता के अलावा) लेते हैं, भले ही मैं हमेशा किसी को नहीं दिखाता।
माता-पिता को स्थापित करने और उसी माता-पिता को जोड़ने के लिए कॉलर जिम्मेदार है।
class Child { public Child(Parent parent) {Parent=parent;} public Parent Parent {get; private set;} } class Parent { // singleton child public Child Child {get; set;} //children private List<Child> _children = new List<Child>(); public List<Child> Children { get {return _children;} } }
डाउनसाइड: अभिभावक को सेट करना उपभोक्ता के लिए दो चरणों वाली प्रक्रिया है।
var child = new Child(parent); parent.Children.Add(child);
नकारात्मक पक्ष: त्रुटि प्रवण। कॉलर बच्चे को अलग-अलग माता-पिता से जोड़ सकता है, जिसका उपयोग बच्चे को शुरू करने के लिए किया गया था।
var child = new Child(parent1); parent2.Children.Add(child);
माता-पिता सत्यापित करता है कि कॉलर माता-पिता के लिए बच्चे को जोड़ता है जिसके लिए आरंभीकृत किया गया था।
class Child { public Child(Parent parent) {Parent = parent;} public Parent Parent {get; private set;} } class Parent { // singleton child private Child _child; public Child Child { get {return _child;} set { if (value.Parent != this) throw new Exception(); _child=value; } } //children private List<Child> _children = new List<Child>(); public ReadOnlyCollection<Child> Children { get {return _children;} } public void AddChild(Child child) { if (child.Parent != this) throw new Exception(); _children.Add(child); } }
डाउनसाइड: कॉलर को अभी भी पैरेंट सेट करने के लिए दो-चरण की प्रक्रिया है।
डाउनसाइड: रनटाइम चेकिंग - प्रदर्शन को कम करता है और प्रत्येक ऐड / सेटर में कोड जोड़ता है।
जब बच्चे को माता-पिता में जोड़ा जाता है / सौंपा जाता है, तो माता-पिता बच्चे के माता-पिता के संदर्भ (खुद को) निर्धारित करते हैं। जनक सेटर आंतरिक है।
class Child { public Parent Parent {get; internal set;} } class Parent { // singleton child private Child _child; public Child Child { get {return _child;} set { value.Parent = this; _child = value; } } //children private List<Child> _children = new List<Child>(); public ReadOnlyCollection<Child> Children { get {return _children;} } public void AddChild(Child child) { child.Parent = this; _children.Add(child); } }
नकारात्मक पक्ष: बच्चा बिना माता-पिता के संदर्भ के बनाया जाता है। कभी-कभी आरंभीकरण / सत्यापन के लिए माता-पिता की आवश्यकता होती है जिसका अर्थ है कि बच्चे के माता-पिता के सेटर में कुछ आरंभीकरण / सत्यापन किया जाना चाहिए। कोड जटिल हो सकता है। बच्चे को लागू करना इतना आसान होगा यदि उसके पास हमेशा इसका मूल संदर्भ हो।
पैरेंट फैक्ट्री ऐड मेथड्स को उजागर करता है ताकि एक बच्चे का हमेशा पेरेंट रेफरेंस हो। बाल संवार आंतरिक है। जनक सेटर निजी है।
class Child { internal Child(Parent parent, init-params) {Parent = parent;} public Parent Parent {get; private set;} } class Parent { // singleton child public Child Child {get; private set;} public void CreateChild(init-params) { var child = new Child(this, init-params); Child = value; } //children private List<Child> _children = new List<Child>(); public ReadOnlyCollection<Child> Children { get {return _children;} } public Child AddChild(init-params) { var child = new Child(this, init-params); _children.Add(child); return child; } }
डाउनसाइड: जैसे इनिशियलाइज़ सिंटैक्स का उपयोग नहीं कर सकते
new Child(){prop = value}
। इसके बजाय करना होगा:var c = parent.AddChild(); c.prop = value;
डाउनसाइड: ऐड-फैक्ट्री विधियों में चाइल्ड कंस्ट्रक्टर के मापदंडों की नकल करना है।
नकारात्मक पक्ष: एक एकल बच्चे के लिए एक संपत्ति सेटर का उपयोग नहीं कर सकते। यह लंगड़ा लगता है कि मुझे मूल्य निर्धारित करने के लिए एक विधि की आवश्यकता है लेकिन एक संपत्ति पाने वाले के माध्यम से रीड एक्सेस प्रदान करें। यह लोप हो गया है।
बाल अपने निर्माता में संदर्भित माता-पिता से खुद को जोड़ता है। बाल चोर जनता है। माता-पिता से कोई भी सार्वजनिक पहुंच नहीं है।
//singleton class Child{ public Child(ParentWithChild parent) { Parent = parent; Parent.Child = this; } public ParentWithChild Parent {get; private set;} } class ParentWithChild { public Child Child {get; internal set;} } //children class Child { public Child(ParentWithChildren parent) { Parent = parent; Parent._children.Add(this); } public ParentWithChildren Parent {get; private set;} } class ParentWithChildren { internal List<Child> _children = new List<Child>(); public ReadOnlyCollection<Child> Children { get {return _children;} } }
डाउनसाइड: कॉलिंग सिंटैक्स महान नहीं है। आम तौर
add
पर कोई अभिभावक को इस तरह से एक वस्तु बनाने के बजाय एक विधि कहता है :var parent = new ParentWithChildren(); new Child(parent); //adds child to parent new Child(parent); new Child(parent);
और इस तरह एक वस्तु बनाने के बजाय एक संपत्ति सेट करता है:
var parent = new ParentWithChild(); new Child(parent); // sets parent.Child
...
मैंने अभी सीखा कि एसई कुछ व्यक्तिपरक प्रश्नों की अनुमति नहीं देता है और स्पष्ट रूप से यह एक व्यक्तिपरक प्रश्न है। लेकिन, शायद यह एक अच्छा व्यक्तिपरक सवाल है।