कंप्यूटेड वैल्यूज़ एंड सिंपल रीड्स - मेरे डोमेन ड्रिवेन डिज़ाइन्स के लिए गहरा दर्द!


9

समस्या का मैं लगातार सामना कर रहा हूं कि डेटा स्टोर के खिलाफ कुशलता से काम करते हुए डोमेन लॉजिक द्वारा संचालित गणना मूल्यों से कैसे निपटना है।

उदाहरण:

मैं एक सेवा के माध्यम से अपने भंडार से उत्पादों की सूची लौटा रहा हूं। यह सूची क्लाइंट द्वारा भेजे गए अनुरोध डीटीओ से पेजिनेशन जानकारी द्वारा सीमित है। इसके अलावा, डीटीओ एक सॉर्ट पैरामीटर (क्लाइंट-फ्रेंडली एनम) निर्दिष्ट करता है।

एक सरल परिदृश्य में, सब कुछ बहुत अच्छा काम करता है: सेवा रेपो के लिए पेजिंग और सॉर्टिंग अभिव्यक्तियाँ भेजता है और रेपो डीबी के लिए एक कुशल क्वेरी जारी करता है।

यह सब टूट जाता है, हालांकि, जब मुझे अपने डोमेन मॉडल से मेमोरी में उत्पन्न मूल्यों पर सॉर्ट करने की आवश्यकता होती है। उदाहरण के लिए उत्पाद वर्ग में एक IsExpired () विधि है जो व्यावसायिक तर्क के आधार पर एक बूल लौटाती है। अब मैं रेपो लेवल पर सॉर्ट और पेज नहीं बना सकता - यह सब मेमोरी (अक्षम) में किया जाएगा और मेरी सर्विस को इन पार्म्स को रेपो में कब जारी करना है और कब सॉर्टिंग / पेजिंग करना है? अपने आप।

एकमात्र पैटर्न जो मुझे समझ में आता है, वह है कि इकाई की स्थिति को db में संग्रहीत करें (IsExpired () एक आसानी से फ़ील्ड बनाएं और सहेजने से पहले इसे डोमेन तर्क के माध्यम से अपडेट करें)। अगर मैं इस तर्क को एक अलग "रीड मॉडल / डटो" और "रिपोर्टिंग" रिपॉजिटरी में अलग करता हूं, तो मैं अपने मॉडल को जितना मैं चाहूंगा उससे अधिक एनीमिक बना रहा हूं।

BTW, हर उदाहरण मैंने वहाँ गणनाओं के लिए देखा है जैसे यह वास्तव में इन-मेमोरी प्रोसेसिंग पर निर्भर करता है और इस तथ्य पर निर्भर करता है कि यह लंबे समय में बहुत कम कुशल है। शायद मैं समय से पहले अनुकूलन कर रहा हूं, लेकिन यह मेरे साथ सही नहीं बैठता है।

मुझे यह सुनकर अच्छा लगेगा कि दूसरों ने इससे कैसे निपटा है क्योंकि मुझे यकीन है कि यह डीडीडी से जुड़े लगभग प्रोजेक्ट पर आम है।

जवाबों:


3

मुझे नहीं लगता कि एक ही डेटा मॉडल के दो अलग डोमेन मॉडल होने से आपका डोमेन एनीमिक हो जाता है। एनीमिक डोमेन मॉडल वह है, जहां अक्सर व्यापार तर्क जो परिवर्तन होता है, वह डोमेन से एक सेवा परत (या यूआई परत में और भी बदतर) में छिपा होता है।

कमांड और क्वेरी डोमेन मॉडल का पृथक्करण अक्सर जासूसी किया जाता है और इसका एक अच्छा अनुमान है कि आप CQRS (कमांड क्वेरी रिस्पॉन्सिबिलिटी सेग्रीगेशन) में Google कर सकते हैं।

डोमेन मॉडल पैटर्न का उपयोग करते हुए, उदी दहन

जबकि मैं एक ऐसा निरंतर ऑब्जेक्ट मॉडल बनाने में अतीत में "सफल" था, जो कमांड और क्वेरी दोनों को हैंडल करता था, इसे अक्सर स्केल करना बहुत मुश्किल था, क्योंकि सिस्टम के प्रत्येक भाग ने मॉडल को एक अलग दिशा में टग दिया था।

यह पता चला है कि डेवलपर्स अक्सर व्यवसाय की तुलना में अधिक ज़ोरदार आवश्यकताओं को लेते हैं जो वास्तव में आवश्यक हैं। उपयोगकर्ता को जानकारी दिखाने के लिए डोमेन मॉडल संस्थाओं का उपयोग करने का निर्णय केवल एक उदाहरण है।

[...]

याद करने के लिए पर्याप्त पुराने के लिए, COM + का उपयोग करने के आसपास की सर्वोत्तम प्रथाओं ने हमें केवल-पढ़ने के लिए और पढ़ने-लिखने के तर्क के लिए अलग-अलग घटक बनाने के लिए निर्देशित किया। यहां हम एक दशक बाद, एंटिटी फ्रेमवर्क जैसी नई तकनीकों के साथ हैं, फिर भी उन्हीं सिद्धांतों को धारण करना जारी है।

अक्का अभिनेताओं और कार्यात्मक डोमेन मॉडल के साथ CQRS, देबाशीष घोष

ग्रेग यंग ने DDD और CQRS पर कुछ बेहतरीन सत्र दिए हैं। 2008 में उन्होंने कहा कि "एक एकल मॉडल रिपोर्टिंग, खोज और लेनदेन व्यवहार के लिए उपयुक्त नहीं हो सकता है।" हमारे पास कम से कम दो मॉडल हैं - एक वह जो आदेशों को संसाधित करता है और दूसरे मॉडल में परिवर्तन करता है जो उपयोगकर्ता प्रश्नों और रिपोर्टों को प्रस्तुत करता है। एप्लिकेशन के ट्रांजेक्शनल व्यवहार को एग्रीगेट और रिपॉजिटरी के समृद्ध डोमेन मॉडल के माध्यम से निष्पादित किया जाता है, जबकि प्रश्नों को सीधे डी-सामान्यीकृत डेटा मॉडल से परोसा जाता है।

CQRS, मार्टिन फाउलर

CQRS द्वारा जो परिवर्तन किया गया है, वह उस वैचारिक मॉडल को अद्यतन और प्रदर्शन के लिए अलग-अलग मॉडल में विभाजित करने के लिए है, जिसे वह CommandQuerySeparation की शब्दावली के बाद क्रमशः कमांड और क्वेरी के रूप में संदर्भित करता है। तर्क यह है कि कई समस्याओं के लिए, विशेष रूप से अधिक जटिल डोमेन में, कमांड और प्रश्नों के लिए समान वैचारिक मॉडल होने से एक अधिक जटिल मॉडल होता है जो न तो अच्छी तरह से होता है।

संक्षेप में, कमांड मॉडल को समाप्त करने का आपका विचार समाप्त हो गया है और इसे डेटाबेस में पास करना बिल्कुल ठीक है। ऊपर दिए गए पहले लेख के माध्यम से पढ़ें और आप समान लेकिन अधिक जटिल परिदृश्य देखेंगे।


2

विनिर्देश

मुझे पता है कि आपने पहले ही एक उत्तर स्वीकार कर लिया है, लेकिन, आपने DDD के बारे में पूछा, और इसके लिए सटीक मिलान वही है जिसे इवांस 'विनिर्देशन' कहते हैं:
प्रत्यक्ष Google पुस्तकें लिंक
यदि वह लिंक इन परिणामों में पुस्तक के लिए काम नहीं करता है
यदि आपके पास पुस्तक है तो यह पृष्ठ २२६ है।

पृष्ठ पर 227 विनिर्देशों के लिए 3 उपयोग हैं: सत्यापन, विभाजन, एक नई विशेष वस्तु का निर्माण। आपका 'चयन' है - IsExpired।

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

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

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

अन्यथा आपको इस विनिर्देश के लिए एक विशेष रिपॉजिटरी विधि बनानी होगी जो कि विनिर्देश ऑब्जेक्ट से उपयोग की जाती है। विनिर्देशन से मेल खाने वाली वस्तुओं के कोलीसैटन के लिए कॉल विनिर्देशन के माध्यम से जाएंगे, न कि भंडार। और कम से कम कोड 'i'm 2 स्थानों पर चिल्लाता है, भविष्य के रखवाले को मत भूलना'। इसी तरह की समस्या के समाधान के लिए पृष्ठ 231-232 पर एक अद्भुत उदाहरण है।

विनिर्देश डीडीडी की 'शुद्धता' का 'अनुमत' रिसाव / स्लिपेज है। यह अभी भी विभिन्न उद्देश्यों के लिए आपकी आवश्यकताओं की पूर्ति नहीं कर सकता है। उदाहरण के लिए, ORM खराब SQL उत्पन्न कर सकता है; बहुत अधिक अतिरिक्त कोडिंग हो सकती है। तो आपको रिपॉजिटरी मेथड को कॉल करना पड़ सकता है जैसे कि यह लगभग स्पेसिफिकेशन में एसक्यूएल लगाने जैसा है। बेशक एक बुरी बात है। लेकिन मत भूलो, आपके कार्यक्रम को उचित गति से काम करना है। इसमें डीडीडी शुद्धता पुरस्कार जीतने की जरूरत नहीं है। तो डेटास्टोर्स को स्विच करने की वास्तविकता का मतलब हो सकता है कि कार्यक्रम के दौरान पुराने ज़माने के शल्यचिकित्सा हो। साथ ही एक बुरी बात भी। लेकिन एक धीमी (उर्फ SUCKing) कार्यक्रम जितना बुरा नहीं है। यदि विभिन्न डीबी पर बॉक्स से बाहर भागना एक वास्तविकता है, तो जाहिर है, आप प्रत्येक विनिर्देश के लिए प्रत्येक डेटास्टोर के लिए व्यावसायिक नियमों की नकल करेंगे। कम से कम आपके पास इस मामले पर अपनी उंगली है और आप रिपॉजिटरी स्वैप करते समय रणनीति पैटर्न का उपयोग कर सकते हैं। लेकिन अगर आप एक विशिष्ट डीबी का उपयोग कर रहे हैं तो पहले से ही याद रखेंYAGNI।

CQRS के बारे में: ऊपर से pdr द्वारा फाउलर का उद्धरण अभी भी यहाँ सही है: "कमांड और क्वेरी के लिए समान वैचारिक मॉडल होने से एक और अधिक जटिल मॉडल बन जाता है जो न तो अच्छा होता है" ... और आपको CQRS या समान का उपयोग करने की आवश्यकता हो सकती है। लेकिन यह एक विकास और रखरखाव के दृष्टिकोण से बहुत अधिक महंगा है। यदि आप दूसरों के साथ प्रतिस्पर्धा में एक पैकेज विक्रेता हैं, तो यह भुगतान कर सकता है। यदि आप एक ग्राहक के लिए एक कस्टम LOB ऐप लिख रहे हैं, तो पूर्णता के लिए शूटिंग एक खराब विकल्प है। आपको यह तय करने की आवश्यकता है कि पूरी तरह से या ज्यादातर डबल मॉडल होने का मूल्य अतिरिक्त प्रयास के लायक है या नहीं। विशिष्टताएक अच्छा समझौता है क्योंकि यह आपको इस अलगाव को उस कार्यक्रम के सिर्फ एक छोटे हिस्से में करने की अनुमति देता है, जिसकी आवश्यकता (विकास) गति और एक मॉडल की सादगी के साथ है। सौभाग्य!


यह सही समझ में आता है। मुझे लगता है कि मुझे बुलेट को काटने और इवांस की किताब पढ़ने की आवश्यकता है :-) मैं अब देख रहा हूं कि इन अवधारणाओं की उथली समझ होना वास्तव में आपको पंगु बना सकता है!
Drogon

0

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

DDD का मतलब यह नहीं है कि आपकी रिपॉजिटरी को बेवकूफ बनाने की जरूरत है - इसका मतलब है कि आपके डोमेन को यह जानने की जरूरत है कि आपके रिपॉजिटरी से कैसे बात की जाए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.