32

मैं डोमेन-संचालित डिज़ाइन (डीडीडी) सीखने की कोशिश कर रहा हूं, और मुझे लगता है कि मुझे मूल विचार मिला है। लेकिन मुझे कुछ भ्रमित कर रहा है।डीडीडी - पर्सिस्टेंस मॉडल और डोमेन मॉडल

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

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

Just Stop It! The Domain Model Is Not The Persistence Model

अगर यह सच है क्या अलग दृढ़ता डोमेन वस्तुओं से वस्तुओं होने का लाभ हो सकता है?

+2

यहां एक पोस्ट है जिसे मैंने इस सटीक विषय पर लिखा है: http://enterprisecraftsmanship.com/2016/04/05/having-the-domain-model-separate-from-the-persistence-model/ – Vladimir

उत्तर

41

बस इस तरह से सोचें, डोमेन मॉडल कुछ भी पर निर्भर नहीं होना चाहिए और इसमें कोई बुनियादी ढांचा कोड नहीं होना चाहिए। डोमेन मॉडल को क्रमशः या कुछ ओआरएम ऑब्जेक्ट्स से प्राप्त नहीं होना चाहिए या उन्हें साझा नहीं करना चाहिए। ये सभी बुनियादी ढांचे की चिंताओं हैं और उन्हें डोमेन मॉडल से अलग परिभाषित किया जाना चाहिए।

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

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

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

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

सॉफ्टवेयर विकास की दुनिया में लिए

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

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

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

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

+1

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

+1

मैं उस पर भी एक टिप्पणी देखना चाहता हूं। – Seralize

+0

अपने प्रश्नों के उत्तर देने के लिए टिप्पणीकर्ताओं के लिए अद्यतन जोड़ा गया। –

9

डीडीडी में, दृढ़ता मॉडल और डोमेन मॉडल अलग-अलग चीजें हैं?

हां, लेकिन यह अनिवार्य रूप से दृढ़ता मॉडल का प्रतिनिधित्व करने के लिए कक्षाओं का एक अलग सेट इंगित नहीं करता है।

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

यदि दृढ़ता के लिए दस्तावेज़ डेटाबेस का उपयोग करना है, तो आमतौर पर दृढ़ता मॉडल के लिए भी कम आवश्यकता होती है क्योंकि डोमेन मॉडल को बनाए रखने के लिए केवल क्रमिक होने की आवश्यकता होती है।

इसलिए, एक जटिल मैपिंग मॉडल का उपयोग करें जब एक जटिल मैपिंग है जिसे डोमेन मॉडल में ORM मैपिंग के साथ प्राप्त नहीं किया जा सकता है। डोमेन मॉडल और दृढ़ता मॉडल के बीच का अंतर कार्यान्वयन के बावजूद बनी हुई है।

+0

हम्म, इसलिए मैं जब तक मैं दृढ़ता से सही तरीके से संभाल सकता हूं तब तक वही कक्षाओं का उपयोग कर सकते हैं। जब यह पर्याप्त नहीं होता है, तो मैं दृढ़ता के लिए डोमेन कक्षाओं के बजाय कुछ नए वर्गों पर पुनर्विचार और जोड़ सकता हूं। क्या इसे मैंने ठीक तरह से लिया? – ayk

+0

हां, और दृढ़ता-विशिष्ट वर्ग विभिन्न प्रकार के स्वादों में आ सकते हैं। वे या तो डेटाबेस और डोमेन के बीच एक साधारण डीटीओ हो सकते हैं या वे एनएचबर्ननेट जैसे मौजूदा मैपिंग इंफ्रास्ट्रक्चर का हिस्सा बन सकते हैं। – eulerfx

+0

मुझे लगता है, अब यह स्पष्ट है, आपके ध्यान और सहायता के लिए बहुत बहुत धन्यवाद। – ayk

4

डीडीडी में, दृढ़ता मॉडल और डोमेन मॉडल अलग-अलग चीजें हैं?

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

जैसा कि अन्य एवरों ने इंगित किया है कि प्रत्येक विकल्प में इसके पेशेवर और विपक्ष हैं। इस answer पर एक नज़र डालें जहां मैं उनमें से कुछ का विस्तार करता हूं।

+1

मैंने डीडीडी के बारे में बहुत सारे लेख पढ़े लेकिन आपका संक्षिप्त विवरण सबसे अच्छा है। धन्यवाद। – user2980426

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