2010-11-01 13 views
5

मैं समझता हूं कि हमें सीधे समग्र रूट के बच्चों को नहीं बदलना चाहिए, बल्कि इसके बजाय उन्हें समग्र रूट पर विधियों के माध्यम से किया जाना चाहिए। ईजी। 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 स्पष्ट समस्याएं हैं:

  1. हमें कुल रूट पर सभी संभावित IMedicalNote उप-वर्गों के सभी उपलब्ध गुणों को पहले से परिभाषित करना होगा। यह स्वीकार्य नहीं है क्योंकि उप-वर्गों की संख्या बढ़ने की गारंटी है, उस चिकित्सा डेटा के प्रकार पर निर्भर करता है जिसे हम कैप्चर करना चाहते हैं, जो कि पहले स्थान पर विरासत का पूरा बिंदु है।
  2. सूची के भीतर एक ही नोट-प्रकार के कई उदाहरण हो सकते हैं। यह एपीआई असफल हो जाएगा, क्योंकि हम केवल report.SetBloodCheckComment(comment) नहीं कह सकते हैं और उम्मीद है कि यह सूची में ब्लड चेक नोट आइटम अपडेट करेगा, क्योंकि हम सूची में एक से अधिक रक्तशेक नोट आइटम को अनुमति देते हैं।

मैं अभी भी है, क्योंकि यह है कि क्या पूरे MedicalReport कुल बचाया जा मान्य है, चाहे कुल परिवर्तनीय नहीं है नियंत्रित करने के लिए है, इसकी कुल-रूट के माध्यम से इन नोटों को सभी बातचीत को बनाए रखना चाहते, मोटे सुक्ष्म optimistic- समेकन जांच, आदि। लेकिन मैं यह कैसे कर सकता हूं?

उत्तर

4

आश्चर्य कीजिए कि क्या आप कुल जड़ें (या शायद मैंने किया ...) के आसपास मार्गदर्शन की गलत व्याख्या कर रहे हैं।

मैंने कभी भी यह कहते हुए मार्गदर्शन नहीं पढ़ा: "कुल को अपनी समेकित वस्तुओं की हर कल्पनीय संपत्ति के लिए प्रॉक्सी विधियां प्रदान करनी होंगी"। इसके बजाय, मुझे लगता है कि यह कहता है: "कुल एकत्रित वस्तुओं की जीवन चक्र, पहचान और संबंधों को समग्र नियंत्रित करता है"।

तो यह क्लाइंट के लिए पूरी तरह से मान्य है कि वह अपने ऑब्जेक्ट्स में से एक के लिए एक (क्षणिक) संदर्भ के लिए पूछें और इसके साथ कुछ करें।मैं शब्दों पुष्टि करने के लिए DDD यहाँ की मेरी नकल नहीं है, लेकिन यह है कि DDD summary ebook (p53) के साथ संगत प्रतीत होता है जो कहते हैं:

यह रूट में आंतरिक वस्तुओं की क्षणिक संदर्भ पारित करने के लिए संभव है बाह्य, इस शर्त के साथ कि बाहरी ऑब्जेक्ट्स ऑपरेशन समाप्त होने के बाद संदर्भ नहीं रखता है।

तो, अपने मामले ग्राहकों में IMedicalNote का उदाहरण (रों) के लिए MedicalReport पूछना होगा, वापस उपप्रकार मिलता है, के रूप में उपयुक्त उन पर काम करते हैं और यदि लागू हो जड़ को वापस गुजरती हैं।

जैसा कि मैंने कहा: यह सुनिश्चित नहीं कर सकता कि डीडीडी के साथ लाइन में है, लेकिन सामान्य ज्ञान का कहना है कि यह कुल रूट में प्रत्येक उप प्रकार के प्रत्येक प्रॉपर्टी/विधि को प्रतिबिंबित करने की कोशिश करने से अधिक स्केलेबल और लचीला समाधान है।

hth।

+0

मेरी समझ यह है कि आप आंतरिक वस्तु (IMEDicalNote) को पुनर्प्राप्त कर सकते हैं लेकिन केवल पढ़ने के उद्देश्य के लिए। आपको इसमें कोई संशोधन नहीं करना चाहिए। सभी संशोधनों को रूट के माध्यम से बनाया जाना चाहिए ताकि यह अखंडता को नियंत्रित कर सके। इसके अलावा, इसे रूट पर वापस पास करके क्या मतलब है? एक बार जब हम बच्चे की संपत्ति को बाहरी रूप से संशोधित कर देते हैं, तो यह है, यह बदल गया है (संदर्भ द्वारा), रूट को छोड़कर, है ना? "रूट पर वापस जाने" क्या करता है? – Sheepy

+0

माफी, कुछ हद तक अस्पष्ट जवाब। रूट उन ऑब्जेक्ट्स की प्रतियों को वापस भेजता है जो ग्राहक तब अद्यतन करते हैं और रूट पर वापस जाते हैं। रूट फिर इनवेरिएंट की जांच और संबंध स्थापित करने के लिए ज़िम्मेदार है। जिम्मेदारी का एक समझदार विभाजन प्रदान करता है: रूट समेकित वस्तुओं के बीच संबंधों और बाधाओं के बारे में जानता है लेकिन सभी उपप्रकारों के विवरण जानने की आवश्यकता नहीं है। ग्राहक आवश्यकतानुसार विशिष्ट उपप्रकारों पर काम कर सकते हैं। नोट रूट को कुछ उपप्रकार विवरणों को जानने की आवश्यकता हो सकती है (उदा। यदि इसे बिल्कुल एक 'ब्लड चेक नोट' रखना चाहिए लेकिन कई 'तापमान नोट' हो सकते हैं)। – sfinnie

+0

क्या आप क्लोन तंत्र बनाने का मतलब रखते हैं ताकि जड़ हमेशा रूट के सार्वजनिक गेटटर के माध्यम से उपयोग किए जाने पर प्रत्येक बच्चे-नोट के क्लोन को वापस कर दे? और फिर ग्राहक इन बच्चों को रूट पर वापस लौटने के बाद इन मानों को अपनी वास्तविक वस्तु पर वापस लाने का एक तरीका है। बस यह स्पष्ट करना चाहता था कि क्या आपका मतलब है, क्योंकि यह काफी काम की तरह लगता है। चीयर्स – Sheepy

संबंधित मुद्दे