DDD बंधे संदर्भ और डोमेन?


16

मैं डेटाबेस तालिकाओं (एग्रीगेट्स, एंटिटीज / वैल्यू ऑब्जेक्ट्स) के 10 के साथ एक अपेक्षाकृत जटिल एप्लिकेशन में काम कर रहा हूं और डीडीडी लागू कर रहा हूं। इस बिंदु पर यह मूल रूप से DDD-Lite प्रतीत होता है जिसका अर्थ है कि अनुप्रयोग / डोमेन सेवाएँ, डोमेन मॉडल (एंटिटीज़, वैल्यू ऑब्जेक्ट्स) और रिपॉजिटरी हैं।

मैंने डीडीडी को लागू करने वाली एक पुस्तक को उठाया और पहली चीज जिसका वह उल्लेख कर रहा है वह है डीडीडी-लाइट एंड बाउंडेड कॉन्टेक्स्ट्स और डोमेन इवेंट्स जो पहली गलतियों के रूप में गायब हैं जो डीडीडी की शुरुआत के समय सामान्य हैं।

वर्तमान में मैंने एग्रीगेट संबंधों द्वारा डोमेन मॉडल के आयोजन की कोशिश की है, और इसे प्रदर्शित करने के लिए नेमस्पेस का उपयोग किया है।

डोमेन मॉडल प्रोजेक्ट को अलग-अलग बाउंडेड संदर्भों (अभी तक) में अलग करने से संबंधित लाभ / गिरावट को देखने में मैं असफल रहा हूँ। शायद यह बाद में स्पष्ट हो जाएगा, लेकिन मैं बाउंडेड कॉन्टेक् ट्स (और संभवतः उप डोमेन आदि पर कुछ वास्तविक जीवन की प्रतिक्रिया चाहूंगा, यदि वे इसमें टाई करते हैं)।


यह मुझे लगता है कि अलग-अलग बंधे हुए संदर्भों को परिभाषित करने वाली एकमात्र चीज भाषाविज्ञान और संबंधित परिचालन अंतरों को अलग करने की आवश्यकता है, अर्थात इसे एक क्षेत्र में उत्पाद और दूसरे क्षेत्र में उत्पाद कहा जाता है, लेकिन वे अलग-अलग हैं, इसलिए हमें दो उत्पादों की आवश्यकता है और वे दोनों कर सकते हैं ' t एक ही मॉडल (एक ही नाम आदि) में हो। तो क्यों न हम केवल उनके अलग-अलग शब्दार्थों का प्रतिनिधित्व करने के लिए नाम बदलें? वे हम सभी पर शासन करने के लिए एक मॉडल रख सकते थे। उप डोमेन प्राकृतिक हैं लेकिन मैं इस समय बंधे हुए संदर्भों को नहीं देख रहा हूं। जरा सोच-समझकर यहां ...
एशले ऐटकेन

मुझे लगता है कि आपको पहले ही एहसास हो गया है कि आपके डोमेन को संदर्भों में विभाजित करना लाभदायक क्यों है। तो अब जो उपयोगी हो सकता है, वह है उन्हें पहचानने का सही तरीका, संदर्भ की सीमाओं को परिभाषित करना। यहां तरीका देखें: मैं यह कर रहा है medium.com/@wrong.about/...
Zapadlo

जवाबों:


20

कुछ अलग विभागों वाले कंपनी पर विचार करें:

  • सॉफ्टवेयर विकास
  • मानव संसाधन
  • लेखांकन

क्या आप एक उपयोगकर्ता मॉडल के साथ आ सकते हैं जो व्यवसाय के उन सभी क्षेत्रों को स्पष्ट रूप से प्रस्तुत कर सकता है? सोचें कि उपयोगकर्ता इकाई प्रत्येक में क्या देख सकती है। शायद यह तीन अलग-अलग संस्थाओं में विभाजित है:

  • डेवलपर
  • कर्मचारी
  • आदाता

प्रत्येक संदर्भ में एक उपयोगकर्ता को तत्काल करने का प्रयास काफी अलग है। शायद यह कुछ इस तरह है:

  • नया कर्मचारी (एसएसएन, नाम, जॉइंडेट, डेटोफर्बथ, लिंग)
  • नया डेवलपर (कर्मचारी, कार्य केंद्र, साख)
  • नया भुगतानकर्ता (कर्मचारी, भूमिका)

उदाहरण के लिए बहाना, संदर्भ के लिए एक उचित डोमेन मॉडल के बिना सटीक वर्णन करना कठिन है

यदि आपने एक भोले-भाले कार्यान्वयन का उपयोग किया है और एक एकल उपयोगकर्ता इकाई का उपयोग किया है, तो यह गेटर्स और सेनेटर्स से भरा एक एनीमिक डेटा मॉडल होगा, क्योंकि आप पूरी तरह से उपयोगकर्ता का पूरी तरह से प्रतिनिधित्व नहीं कर सकते हैं।

व्यवसाय में स्पष्ट सीमाएं हैं, इसलिए उन्हें उस तरह से मॉडल करना उपयोगी है। एक पेरोल प्रणाली में एक उपयोगकर्ता बनाम एक उपयोगकर्ता लॉगिंग बनाम एक गेम खेलने वाले उपयोगकर्ता सभी बहुत अलग हैं, भले ही वे एक ही भव्य प्रणाली का हिस्सा हों।

दूसरे तरीके से सोचना - अब आप अपने डेवलपर प्रबंधन कोड को अपने सिस्टम के बाकी हिस्सों से बहुत हल्का और स्वतंत्र बना सकते हैं। यह चिंता करने के लिए कम सामान के साथ अधिक सटीक प्रकार का उपयोग कर सकता है। यह छोटे उपतंत्रों के निर्माण का कदम है जो अंततः अपने स्वयं के अनुप्रयोग में निकाले जा सकते हैं।


सहायक उदाहरण के लिए धन्यवाद जो 3 ईसा पूर्व की विभिन्न आवश्यकताओं को स्पष्ट करने में मदद करता है।
lko

नहीं जिस तरह से मैं इन अवधारणाओं को देखने के अभ्यस्त कर रहा हूँ: आम तौर पर एक Employeeएक नहीं है User, यह है एक UserUserबस एक इकाई के माध्यम से जो एक व्यक्ति में और उपयोग एक या संगठन के अंदर और अधिक अनुप्रयोगों लॉग इन कर सकते है। और Employeeहमेशा एक नहीं होता है User। इसके अलावा, आप आम तौर पर विभिन्न विभागों के लिए एक साधारण आवेदन प्राप्त नहीं करते हैं; आम तौर पर, प्रत्येक विभाग के अपने ऐप होते हैं, जिनमें से प्रत्येक का अपना डोमेन मॉडल होता है। इसलिए, मेरे लिए यह उत्तर एक ही कोडबेस में अलग-अलग बंधे हुए संदर्भों की आवश्यकता को स्पष्ट करने में मदद नहीं करता है।
रोजेरियो

@ रोजेरियो आपकी आपत्ति वास्तव में एक सुंदर उदाहरण है कि क्यों हर
बंधे हुए

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

16

मैं आपको एक और उदाहरण दे सकता हूं। विचार करें कि आपके पास कुछ ईकॉमर्स प्रणाली है। आपके पास वहां उत्पाद होंगे, हालांकि उत्पाद कम से कम दो अलग-अलग डोमेन का हिस्सा होंगे:

  • उत्पाद सूची, जहाँ आप अपने उत्पाद का विवरण और सभी विशेषताएँ रखते हैं
  • इन्वेंटरी, जहां आपके पास उत्पाद स्टॉक स्तर है

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

यदि आप, हालांकि, दो बंधे हुए संदर्भ हैं, तो एक डोमेन में आपके द्वारा किए गए सभी परिवर्तन दूसरे को प्रभावित नहीं करेंगे जैसे ही आप अपने संचार चैनलों को स्पष्ट रखते हैं। इसका मतलब होगा कि आपको डेटा डुप्लीकेशन की आवश्यकता होगी लेकिन यह कम से कम कपल कंपोनेंट आधारित एप्लिकेशन के लिए भुगतान करने की लागत है। आपके डोमेन डोमेन घटनाओं का उपयोग करके एक दूसरे से बात कर सकते हैं। यहां तक ​​कि अगर आप शुरुआत में SOA आधारित आवेदन करने की योजना नहीं बनाते हैं, तो आप उस स्तर तक बड़े पैमाने पर सक्षम होंगे जब आपको अपेक्षाकृत कम प्रयास की आवश्यकता होती है क्योंकि आप अपने डोमेन की घटनाओं के लिए परिवहन को बदलते हैं, इसके पीछे का विचार बरकरार है।

अपडेट: एरिक इवांस से स्किल्समैटर पर एक अच्छा स्किलकास्ट है। वह पुरानी कहानी की एक समानता देता है, जब कई अंधे व्यक्ति अपने दृष्टिकोण से एक हाथी का वर्णन करते हैं। चूंकि प्रत्येक आदमी केवल हाथी के एक हिस्से को छू सकता है, इसलिए वे इसे "पेड़", "दीवार", "सांप", "रस्सी" के रूप में वर्णित करते हैं। और उनमें से प्रत्येक व्यक्ति उनके संदर्भ में सही है। बद्ध प्रसंग वह जगह है जहाँ सर्वव्यापी भाषा रहती है। संदर्भ के बाहर, इन शब्दों का पूरी तरह से अलग अर्थ हो सकता है, लेकिन संदर्भ के अंदर, भाषा कई डोमेन में समान है। ग्रेग यंग दृढ़ता से अध्याय 11 से नीली किताब पढ़ना शुरू करने का सुझाव देते हैं, क्योंकि सबसे महत्वपूर्ण, मौलिक अवधारणाओं को वहां समझाया गया है। पुस्तक की शुरुआत में सामरिक पैटर्न पर ध्यान केंद्रित इस "DDD- प्रकाश" दृष्टिकोण बहुत आम है,


1
+1 भी दोहराव लाने के लिए। यह पहली बार में थोड़ा भ्रामक है ("क्या मैं यह गलत कर रहा हूँ?), लेकिन यह पूरी तरह से प्राकृतिक है, किसी भी कई मामलों में, आवश्यक है
एड्रियन श्नाइडर

इस परिदृश्य में ये Productदोनों वर्ग एक ही आईडी को काल्पनिक रूप से साझा कर रहे हैं (उदाहरण के लिए दोनों अलग-अलग बीसी तालिकाओं में एक एकल उत्पाद आईडी के साथ एक टेबल के लिए एक विदेशी कुंजी है)? शायद डोमेन ईवेंट के साथ संचार करते समय वे उस आईडी का उपयोग कर सकते हैं?
lko

1
यह सब इस बात पर निर्भर करता है कि भंडारण क्या चुना गया है। क्रॉस-डोमेन को संदर्भित करने के लिए तकनीकी आईडी का उपयोग करना आवश्यक नहीं है। क्रॉस-रेफरेंस कम्युनिकेशन करना भी उचित नहीं है।
एलेक्सी ज़िमेरेव

1
ऐसा लगता है कि यह ब्लू बुक को शेल्फ से बाहर निकालने और बाद के अध्यायों को पढ़ने का समय है
मार्कस साइकेड्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.