ORD के साथ DDD, व्यावसायिक तर्क कहाँ जाना चाहिए?


10

मैंने अतीत में एक एमडीए (मॉडल संचालित वास्तुकला) उपकरण का उपयोग किया है जहां हमने यूएमएल के माध्यम से मॉडलिंग की है और इससे अन्य चीजों के बीच व्यापारिक संस्थाएं (हमारा डोमेन मॉडल) और ओआरएम (मैपिंग आदि) उत्पन्न हुई हैं।

डोमेन पर काम करने वाले बहुत सारे व्यवसाय कोड और सेवाएँ मॉडल का हिस्सा थे और हमारे रिपॉजिटरी व्यवसाय संस्थाओं को वापस कर रहे थे (इसलिए यह संभव था कि किसी अन्य ORM पर स्विच करना असंभव हो (ऐसा नहीं था कि हम चाहते थे)।

हालांकि, अब मैं एक परियोजना शुरू कर रहा हूं और मैं डीडीडी के संदर्भ में सोचना चाहता हूं।

अब तक ऐसा लगता है कि जैसे मैंने अपने डोमेन मॉडल में अपना व्यावसायिक तर्क रखा है और रिपॉजिटरी के माध्यम से मैं ओआरएम (जो कभी चुना था) के साथ काम करूंगा। हालाँकि, यदि मैं अनुप्रयोग के ORM भाग के लिए MDA उपकरण का उपयोग जारी रखना चाहता था, तो यहाँ बनाया गया मॉडल बहुत ही एनीमिक होगा (अर्थात इसमें कोई व्यावसायिक तर्क नहीं होगा)। इसी तरह अगर मैंने अपने ORM के लिए Entity फ्रेमवर्क (.net) या NHibernate का उपयोग किया है तो यह भी एक एनेमिक मॉडल होगा। मुझे यकीन नहीं है कि अगर आप अभी एनएचबर्नेट का इस्तेमाल करते हैं तो आप व्यापारिक तर्क कहाँ रखेंगे।

क्या मैं इस तरह से सोचने के लिए सही हूं, दूसरे शब्दों में डीडीडी के साथ डोमेन में सभी व्यापारिक तर्क और बस रिपॉजिटरी के माध्यम से दृढ़ता के लिए ओआरएम का उपयोग करें?

जवाबों:


12

इसलिए यह असंभव होगा कि हम दूसरे ORM (जो हम चाहते थे) से बाहर हो जाएं।

जो गलत लगता है। रिपॉजिटरी पैटर्न का एक प्रमुख लाभ यह है कि आप डेटा एक्सेस लॉजिक को छिपाते हैं और यह आसानी से विनिमेय है।

अब तक ऐसा लगता है कि जैसे मैंने अपने डोमेन मॉडल में अपना व्यावसायिक तर्क रखा है और रिपॉजिटरी के माध्यम से मैं ओआरएम (जो कभी चुना था) के साथ काम करूंगा। हालाँकि, यदि मैं अनुप्रयोग के ORM भाग के लिए MDA उपकरण का उपयोग जारी रखना चाहता था, तो यहाँ बनाया गया मॉडल बहुत ही एनीमिक होगा (अर्थात इसमें कोई व्यावसायिक तर्क नहीं होगा)। इसी तरह अगर मैंने अपने ORM के लिए Entity फ्रेमवर्क (.net) या NHibernate का उपयोग किया है तो यह भी एक एनेमिक मॉडल होगा। मुझे यकीन नहीं है कि अगर आप अभी एनएचबर्नेट का इस्तेमाल करते हैं तो आप व्यापारिक तर्क कहाँ रखेंगे।

एनीमिक डोमेन मॉडल को कई लोगों द्वारा गलत व्यवहार माना जाता है, उदाहरण के लिए मार्टिन फाउलर। आपको इस तरह के डिजाइन से बचना चाहिए क्योंकि इस तरह का मॉडल एक अच्छी वस्तु उन्मुख डिजाइन के बजाय प्रक्रियात्मक डिजाइन तकनीकों की ओर जाता है। फिर आपके पास डेटा कक्षाएं और प्रबंधक / प्रसंस्करण कक्षाएं हैं जिसका अर्थ है कि आपने राज्य और व्यवहार को अलग कर दिया है। लेकिन एक वस्तु वास्तव में "राज्य और व्यवहार" होना चाहिए ।

NHibernate अज्ञानता अज्ञानता पर एक महान काम करता है। आप XML में या फ्लुएंनहाइबरनेट के साथ मैपिंग विवरण छिपा सकते हैं और केवल सादे POCO लिख सकते हैं। NHibernate के साथ एक समृद्ध डोमेन मॉडल बनाना बहुत आसान है। मुझे लगता है कि आप इकाई ढांचे और एमडीए उपकरण के साथ भी ऐसा कर सकते हैं। जब तक यह उपकरण आंशिक कक्षाओं का उत्पादन करता है तब तक आप बिना किसी चिंता के उत्पन्न कोड को आसानी से बढ़ा सकते हैं ताकि नई पीढ़ी आपके उपयोगकर्ता-लिखित कोड को नष्ट कर सके।

इस लंबी कहानी को छोटा करने के लिए। जब आप NHibernate का उपयोग करते हैं, तो कुछ भी नहीं, मैं कुछ भी नहीं दोहराता , आपको एक अमीर डोमेन मॉडल को गले लगाने से रोकता है। मैं इसे FluentNHibernate और हाथ से मैपिंग के साथ उपयोग करने की सलाह देता हूं। मैपिंग कोड लिखने में केवल 5 से 10 मिनट लगते हैं। मुझे लगता है कि इकाई ढांचे के लिए बहुत ही सही है और इसके उपकरण कम से कम आंशिक कक्षाएं बनाते हैं जो आसानी से एक्स्टेंसिबल हैं।

क्या मैं इस तरह से सोचने के लिए सही हूं, दूसरे शब्दों में डीडीडी के साथ डोमेन में सभी व्यापारिक तर्क और बस रिपॉजिटरी के माध्यम से दृढ़ता के लिए ओआरएम का उपयोग करें?

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

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


2
+1: मैं एप्लिकेशन लॉजिक लेयर से डोमेन लॉजिक लेयर को भी अलग करता हूं। मैंने डोमेन तर्क परत में सभी ORM और डेटाबेस सामान रखा। आवेदन तर्क परत ORM, लेनदेन और उस सभी सामान के बारे में कुछ नहीं जानती है: यह केवल व्यावसायिक तर्क कक्षाएं देखता है और उनके तरीकों को कॉल करता है। मैं एक सरल और क्लीनर अनुप्रयोग तर्क परत होने के लिए इस दृष्टिकोण को बहुत प्रभावी मानता हूं।
जियोर्जियो

@ फाल्कन: जानकारी के लिए धन्यवाद। जब मैंने एनेमिक मॉडल का उल्लेख किया तो मेरा मतलब था कि अगर मैं डीडीडी का उपयोग करके एक डोमेन बनाता हूं, तो मेरे रिपॉजिटरी का एक संस्करण संभवतः एमडीए संस्करण होगा जहां मैं सिर्फ अपनी संस्थाओं को एमडीए संस्थाओं (यानी एनीमिक मॉडल) में स्थानांतरित करूंगा और फिर उन्हें जारी रखूंगा। लेनदेन आदि में क्या यह ठीक होगा? मुझे संदेह है कि मैं एमडीए उपकरण का उपयोग करूंगा, लेकिन सिर्फ यह समझने की कोशिश करूंगा कि अगर मैं चाहता तो मैं कैसे कर सकता था। क्या यह सही लगता है?
JD01

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

1
@ JD01: मेरा सुझाव है कि आप निम्न लिंक पर एक नज़र डालें कि कितने एंटरप्राइज़ जावा लोग करते हैं। उनके पास मूल रूप से एक डीएओ, एक डीटीओ और बीओ (व्यावसायिक वस्तु) है। मेरे लिए, यह बहुत सारी परतें हैं लेकिन डिज़ाइन ठीक है। java.sun.com/blueprints/corej2eepatterns/Patterns/…
फाल्कन

@ फाल्कन: हाँ, मैं डीटीओ की तर्ज पर सोच रहा था कि मेरे एमडीए ऑब्जेक्ट हैं, न कि मैं इस तरह से जाऊंगा। डीडीडी खिलाड़ियों के प्रत्येक भाग d0 क्या है की एक पकड़ हो रही है। एक बार फिर से धन्यवाद।
JD01

3

हालाँकि, यदि मैं अनुप्रयोग के ORM भाग के लिए MDA उपकरण का उपयोग जारी रखना चाहता था, तो यहाँ बनाया गया मॉडल बहुत ही एनीमिक होगा (अर्थात इसमें कोई व्यावसायिक तर्क नहीं होगा)।

मुझे नहीं पता कि आप कौन से एमडीए उपकरण का उपयोग कर रहे हैं, लेकिन जिन लोगों के साथ मैंने काम किया है वे हमेशा आंशिक कक्षाएं बनाते हैं ताकि आप उन्हें जितना चाहें उतना व्यावसायिक तर्क के साथ पूरा करने के लिए स्वतंत्र हों।

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

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

इसके अलावा, मुझे लगता है कि फाल्कन ने बहुत कहा कि यह ओआरएम या एमडीए उपकरणों में पूरी तरह से कुछ भी नहीं है जो आपको अमीर डोमेन एंटिटी होने से रोकता है।


नमस्ते, मैं ECO (एंटरप्राइज कोर ऑब्जेक्ट्स) का उपयोग कर रहा हूँ enableobjects.com से और यह बिल्कुल वैसा ही है जैसा आपने इसे बताया।
JD01

1

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

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

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