मैं डोमेन-चालित डिजाइन (डीडीडी) की अवधारणाओं में गोता लगा रहा हूं और कुछ सिद्धांतों को अजीब पाया गया, विशेष रूप से डोमेन और दृढ़ता मॉडल के अलगाव के बारे में। यहाँ मेरी बुनियादी समझ है:
- एप्लिकेशन लेयर पर एक सेवा (एक सुविधा सेट प्रदान करते हुए) डोमेन ऑब्जेक्ट को अपने कार्य को पूरा करने के लिए आवश्यक भंडार से अनुरोध करती है।
- इस भंडार का ठोस कार्यान्वयन उस भंडारण से डेटा प्राप्त करता है जिसे इसके लिए लागू किया गया था
- सेवा डोमेन ऑब्जेक्ट को बताती है, जो व्यावसायिक तर्क को एन्क्रिप्ट करती है, कुछ कार्यों को करने के लिए जो इसके राज्य को संशोधित करता है।
- सेवा संशोधित डोमेन ऑब्जेक्ट को जारी रखने के लिए रिपॉजिटरी को बताती है।
- भंडार में संबंधित प्रतिनिधित्व के लिए रिपॉजिटरी को डोमेन ऑब्जेक्ट को मैप करने की आवश्यकता है।
अब, उपरोक्त मान्यताओं को देखते हुए, निम्नलिखित अजीब लगता है:
विज्ञापन 2:
डोमेन मॉडल संपूर्ण डोमेन ऑब्जेक्ट (सभी फ़ील्ड और संदर्भों सहित) को लोड करने के लिए लगता है, भले ही उन्हें उस फ़ंक्शन के लिए आवश्यक नहीं है जो इसे अनुरोध करते हैं। यदि पूरी तरह से अन्य डोमेन ऑब्जेक्ट्स को संदर्भित नहीं किया जाता है, तो लोडिंग पूरी तरह से भी संभव नहीं हो सकती है, जब तक कि आप उन डोमेन ऑब्जेक्ट्स को लोड नहीं करते हैं और वे सभी ऑब्जेक्ट्स जो वे बदले में संदर्भित करते हैं, और इसी तरह आगे। आलसी लोडिंग का ख्याल आता है, जिसका अर्थ है कि आप अपने डोमेन ऑब्जेक्ट्स को क्वेरी करना शुरू करते हैं जो पहले स्थान पर रिपॉजिटरी की जिम्मेदारी होनी चाहिए।
इस समस्या को देखते हुए, डोमेन ऑब्जेक्ट लोड करने का "सही" तरीका प्रत्येक उपयोग के मामले के लिए एक समर्पित लोडिंग फ़ंक्शन होने लगता है। ये समर्पित फ़ंक्शंस तब उपयोग किए जाने वाले डेटा के लिए आवश्यक डेटा लोड करेंगे, जिसके लिए वे डिज़ाइन किए गए थे। यहीं पर अशुभता का खेल शुरू होता है: सबसे पहले, मुझे रिपॉजिटरी के प्रत्येक कार्यान्वयन के लिए काफी मात्रा में लोडिंग फ़ंक्शन को बनाए रखना होगा, और डोमेन ऑब्जेक्ट्स null
अपने क्षेत्रों में ले जाने वाले अपूर्ण राज्यों में समाप्त होंगे । उत्तरार्द्ध तकनीकी रूप से एक समस्या नहीं होनी चाहिए क्योंकि यदि कोई मूल्य लोड नहीं किया गया था, तो इसे उस कार्यक्षमता के लिए आवश्यक नहीं होना चाहिए जो इसे किसी भी तरह से अनुरोध करता है। अभी भी यह अजीब और एक संभावित खतरा है।
विज्ञापन 3:
एक डोमेन ऑब्जेक्ट निर्माण पर अद्वितीयता की कमी को कैसे सत्यापित करेगा यदि इसमें रिपॉजिटरी की कोई धारणा नहीं है? उदाहरण के लिए, यदि मैं User
एक अद्वितीय सामाजिक सुरक्षा संख्या (जो दी गई है) के साथ एक नया बनाना चाहता था, तो सबसे पहले संघर्ष वस्तु को बचाने के लिए रिपॉजिटरी से पूछने पर होगा, केवल तब जब डेटाबेस पर एक विशिष्ट बाधा परिभाषित की गई हो। अन्यथा, मैं User
दी गई सामाजिक सुरक्षा के साथ देख सकता हूं और नया निर्माण करने से पहले इसमें मौजूद त्रुटि की रिपोर्ट कर सकता हूं । लेकिन तब बाधा की जाँच सेवा में रहती है न कि डोमेन ऑब्जेक्ट में जहाँ वे हैं। मुझे अभी पता चला है कि डोमेन ऑब्जेक्ट्स को सत्यापन के लिए रिपॉजिटरी का उपयोग करने की बहुत अच्छी तरह से अनुमति है।
विज्ञापन 5:
मैं डोमेन ऑब्जेक्ट्स की मैपिंग को स्टोरेज बैकएंड पर कार्य-गहन प्रक्रिया के रूप में देखता हूं, जिसकी तुलना में डोमेन ऑब्जेक्ट्स सीधे आधारभूत डेटा को संशोधित करते हैं। बेशक, यह एक आवश्यक शर्त है कि डोमेन कोड से ठोस भंडारण कार्यान्वयन को समाप्त करना। हालांकि, क्या यह वास्तव में इतनी अधिक लागत पर आता है?
आपके पास मैपिंग करने के लिए आपके पास ओआरएम टूल्स का उपयोग करने का विकल्प है। इन्हें अक्सर ORM के प्रतिबंधों के अनुसार डोमेन मॉडल तैयार करने की आवश्यकता होती है, हालाँकि, या डोमेन से बुनियादी ढांचे की परत पर निर्भरता का परिचय देते हैं (उदाहरण के लिए, डोमेन ऑब्जेक्ट्स में ORM एनोटेशन का उपयोग करके)। यह भी मैंने पढ़ा है कि ORMs एक काफी कम्प्यूटेशनल ओवरहेड का परिचय देते हैं।
NoSQL डेटाबेस के मामले में, जिसके लिए शायद ही कोई ORM जैसी अवधारणाएं मौजूद हैं, आप डोमेन मॉडल में किस गुणों को परिवर्तित करते हैं save()
?
संपादित करें : इसके अलावा, डोमेन ऑब्जेक्ट की स्थिति (यानी प्रत्येक फ़ील्ड का मूल्य) तक पहुंचने के लिए एक रिपॉजिटरी के लिए, डोमेन ऑब्जेक्ट को अपनी आंतरिक स्थिति को प्रकट करने की आवश्यकता होती है जो एनकैप्सुलेशन को तोड़ती है।
सामान्य रूप में:
- लेन-देन का तर्क कहां जाएगा? यह निश्चित रूप से दृढ़ता विशिष्ट है। कुछ स्टोरेज इन्फ्रास्ट्रक्चर भी लेनदेन का समर्थन नहीं कर सकते हैं (जैसे-इन-मेमोरी मॉक रिपॉजिटरी)।
- उन बल्क ऑपरेशंस के लिए, जो कई ऑब्जेक्ट्स को संशोधित करते हैं, क्या मुझे ऑब्जेक्ट के एनकैप्सुलेटेड वैलिडेशन लॉजिक के माध्यम से जाने के लिए प्रत्येक ऑब्जेक्ट को व्यक्तिगत रूप से लोड, संशोधित और स्टोर करना होगा? यह डेटाबेस पर सीधे एक ही क्वेरी को निष्पादित करने का विरोध करता है।
मैं इस विषय पर कुछ स्पष्टीकरण की सराहना करूंगा। क्या मेरी धारणाएँ सही हैं? यदि नहीं, तो इन समस्याओं से निपटने का सही तरीका क्या है?