मैं समझता हूं कि हमें सीधे समग्र रूट के बच्चों को नहीं बदलना चाहिए, बल्कि इसके बजाय उन्हें समग्र रूट पर विधियों के माध्यम से किया जाना चाहिए। ईजी। order.SetOrderLineQty(product, qty);
उप-वर्गीकृत कुल सदस्यों तक पहुंच
लेकिन क्या होगा यदि कुल-रूट के बच्चे कुछ सार हैं? कल्पना कीजिए कि आपके पास कार कुल रूट है, जिसमें कुल के हिस्से के रूप में IWheel की एक सूची है। आप अपने समग्र रूट के माध्यम से पहिया के गुणों को कैसे जोड़/बदल सकते हैं (जो कि ठोस प्रकार के चक्र के बारे में कुछ भी नहीं जानता है)? एक डॉक्टर एक MedicalRerport (कुल जड़-) है, जो (MedicalReport कुल का हिस्सा है) IMedicalNote की एक सूची है बना सकते हैं:
एक वास्तविक दुनिया उदाहरण यह है। IMedicalNote एक बेस-क्लास/इंटरफ़ेस है, जो कुछ ठोस उप-वर्गों में उपclassed है, उदा। BloodcheckNote, तापमान नोट, खनिजसंसंचार नोट, इत्यादि।
प्रत्येक उप-वर्ग में अलग-अलग गुण होते हैं, और वे सभी संपादन योग्य होते हैं। एक मेडिकल रिपोर्ट में कुल में से किसी एक नोट में से एक या अधिक हो सकता है। (प्रत्येक नोट सबक्लास के पास उपयोगकर्ता के लिए एक बड़ी उपयोगकर्ता-नियंत्रण है जो बड़ी मेडिकल रिपोर्ट स्क्रीन के तहत पैनल/टैब के रूप में दिखाया गया है)
मेरा प्रश्न है, मैं इन गुणों को कैसे जोड़/संपादित कर सकता हूं अपने समग्र रूट (मेडिकल रिपोर्ट) के माध्यम से कड़ाई से नोट्स? जब से मैं सीधे इन नोटों गुण बदलने की अनुमति नहीं कर रहा हूँ, एक बदसूरत विकल्प यानी कुल जड़ पर सभी संभव टिप्पणी गुण उजागर (MedicalReport), के द्वारा होता है:
report.SetWhiteBloodCellCount(cellCount);
report.SetBloodCheckComment(comment);
report.SetTemperature(bodyPart, temperature);
report.AddMineral(mineral, concentration);
इनमें से प्रत्येक विधि अपडेट करेगा (या नया बनाएं) अपने आंतरिक बच्चों के संग्रह में आइटम नोट करें। इसके साथ 2 स्पष्ट समस्याएं हैं:
- हमें कुल रूट पर सभी संभावित IMedicalNote उप-वर्गों के सभी उपलब्ध गुणों को पहले से परिभाषित करना होगा। यह स्वीकार्य नहीं है क्योंकि उप-वर्गों की संख्या बढ़ने की गारंटी है, उस चिकित्सा डेटा के प्रकार पर निर्भर करता है जिसे हम कैप्चर करना चाहते हैं, जो कि पहले स्थान पर विरासत का पूरा बिंदु है।
- सूची के भीतर एक ही नोट-प्रकार के कई उदाहरण हो सकते हैं। यह एपीआई असफल हो जाएगा, क्योंकि हम केवल
report.SetBloodCheckComment(comment)
नहीं कह सकते हैं और उम्मीद है कि यह सूची में ब्लड चेक नोट आइटम अपडेट करेगा, क्योंकि हम सूची में एक से अधिक रक्तशेक नोट आइटम को अनुमति देते हैं।
मैं अभी भी है, क्योंकि यह है कि क्या पूरे MedicalReport कुल बचाया जा मान्य है, चाहे कुल परिवर्तनीय नहीं है नियंत्रित करने के लिए है, इसकी कुल-रूट के माध्यम से इन नोटों को सभी बातचीत को बनाए रखना चाहते, मोटे सुक्ष्म optimistic- समेकन जांच, आदि। लेकिन मैं यह कैसे कर सकता हूं?
मेरी समझ यह है कि आप आंतरिक वस्तु (IMEDicalNote) को पुनर्प्राप्त कर सकते हैं लेकिन केवल पढ़ने के उद्देश्य के लिए। आपको इसमें कोई संशोधन नहीं करना चाहिए। सभी संशोधनों को रूट के माध्यम से बनाया जाना चाहिए ताकि यह अखंडता को नियंत्रित कर सके। इसके अलावा, इसे रूट पर वापस पास करके क्या मतलब है? एक बार जब हम बच्चे की संपत्ति को बाहरी रूप से संशोधित कर देते हैं, तो यह है, यह बदल गया है (संदर्भ द्वारा), रूट को छोड़कर, है ना? "रूट पर वापस जाने" क्या करता है? – Sheepy
माफी, कुछ हद तक अस्पष्ट जवाब। रूट उन ऑब्जेक्ट्स की प्रतियों को वापस भेजता है जो ग्राहक तब अद्यतन करते हैं और रूट पर वापस जाते हैं। रूट फिर इनवेरिएंट की जांच और संबंध स्थापित करने के लिए ज़िम्मेदार है। जिम्मेदारी का एक समझदार विभाजन प्रदान करता है: रूट समेकित वस्तुओं के बीच संबंधों और बाधाओं के बारे में जानता है लेकिन सभी उपप्रकारों के विवरण जानने की आवश्यकता नहीं है। ग्राहक आवश्यकतानुसार विशिष्ट उपप्रकारों पर काम कर सकते हैं। नोट रूट को कुछ उपप्रकार विवरणों को जानने की आवश्यकता हो सकती है (उदा। यदि इसे बिल्कुल एक 'ब्लड चेक नोट' रखना चाहिए लेकिन कई 'तापमान नोट' हो सकते हैं)। – sfinnie
क्या आप क्लोन तंत्र बनाने का मतलब रखते हैं ताकि जड़ हमेशा रूट के सार्वजनिक गेटटर के माध्यम से उपयोग किए जाने पर प्रत्येक बच्चे-नोट के क्लोन को वापस कर दे? और फिर ग्राहक इन बच्चों को रूट पर वापस लौटने के बाद इन मानों को अपनी वास्तविक वस्तु पर वापस लाने का एक तरीका है। बस यह स्पष्ट करना चाहता था कि क्या आपका मतलब है, क्योंकि यह काफी काम की तरह लगता है। चीयर्स – Sheepy