DDD - क्या एनीमिक डोमेन मॉडल एक एंटीपैटर्न है? जोर से हम अमीर डोमेन मॉडल का उपयोग कर रहे हैं? [बन्द है]


11

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

हालाँकि, हाल के वर्षों में असहमत आवाज़ें आई हैं, जिसमें दावा किया गया है कि यह एक एंटीपैटर्न नहीं है और यह सॉलिड सिद्धांतों का पालन करने का एक उदाहरण है।

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

मेरे प्रश्न हैं: क्या एनीमिक डोमेन मॉडल को अभी भी एक एंटीपैटर्न माना जाता है? क्या हम सब कुछ (डीडीडी के बारे में) गलत कर रहे हैं? क्या आपको नहीं लगता कि रिच डोमेन मॉडल होने से SOLID सिद्धांतों का उल्लंघन होता है?


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

1
यह चर्चा / बहस मंच के लिए एक शानदार सवाल होगा; लेकिन वर्तमान में एक आधिकारिक जवाब नहीं है। हम उन सवालों को पसंद करते हैं जिनका उत्तर दिया जा सकता है, न कि केवल चर्चा की गई।
VoiceOfUnreason

जवाबों:


9

एडीएम वितरित सेवाओं के समाधान के लिए एक अच्छा पैटर्न है। यह आज के कई वेब आधारित व्यावसायिक मामलों में फिट बैठता है।

विचार करें कि क्या हमारे पास ऑर्डर डोमेन ऑब्जेक्ट है। OOP दृष्टिकोण के साथ हम Order.Purchase () Order.Cancel () आदि जोड़ेंगे। यह एक डेस्कटॉप ऐप में अच्छा काम करेगा, जहाँ हम मेमोरी में ऑर्डर रखते हैं और एक ही उदाहरण के लिए कई काम करते हैं।

लेकिन अगर हमारे पास एक वितरित प्रणाली है, ऐसे कार्यक्रमों के साथ जो सिर्फ एक चीज के लिए हैं, यानी ऑर्डर की सूची तक पहुंचें और प्रत्येक को बदले में खरीद लें, या ऑर्डर की एक सूची प्राप्त करें और प्रत्येक को बदले में रद्द कर दें तो दोनों तरीकों को एक ही वस्तु पर रखने से कोई फायदा नहीं होता है। समझ। हमारे पास दो डोमेन या बाउंडेड कॉन्टेक्ट्स होंगे:

PurchaseSystemOrder.Purchase()

तथा

CancelSystemOrder.Cancel();

इन वस्तुओं को साझा करने वाली एकमात्र चीज़ गुणों की डेटा संरचना होगी।

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

यह एक एनीमिक मॉडल, ऑर्डर करने के लिए कहीं अधिक समझ में आता है, जो सिर्फ डेटा को एनकैप्सुलेट करता है और तदनुसार आपकी सेवाओं का नाम बदल देता है:

PurchaseService.Purchase(Order order)

अब हम फिर से ऑर्डर के बारे में बात कर सकते हैं और हम वर्तमान में तैनात अन्य सेवाओं को प्रभावित किए बिना, जो भी नई प्रक्रिया शुरू करने के लिए सोचते हैं उसे जोड़ सकते हैं।

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

लेकिन एक वितरित प्रणाली में, कई कार्यक्रम हैं, प्रत्येक को केवल एक ही ऑर्डर विधि की आवश्यकता होती है और इसे कई आदेशों पर चलाता है, प्रत्येक को लोड करता है, विधि को चलाता है और फिर इसे छोड़ देता है। इसके लिए केवल एकल सेवा और डेटा ऑब्जेक्ट्स की एक स्ट्रीम की आवश्यकता होती है।

एक समृद्ध मॉडल को पूरी तरह से आबाद करना, सभी तरीकों की आवश्यकताओं और निर्भरता के बारे में चिंता करना, केवल एक को कॉल करना और फिर लगभग तुरंत वस्तु को त्यागना व्यर्थ है।

इसके अलावा तरीकों में से किसी एक में बदलाव से सभी वितरित घटकों को अपडेट करने की आवश्यकता होगी क्योंकि वे सभी अपने तर्क के लिए रिच मॉडल पर निर्भर करते हैं।

मेरे पास सामान के लिए मेरे कोड बेस (एस) में कोई जगह नहीं है जिसकी उन्हें आवश्यकता नहीं है


4
मुझे लगता है क्योंकि मुझे लगता है कि DDD विशेष रूप से बंधे संदर्भ अवधारणा के कारण ठीक से microservices के लिए अच्छी तरह से अनुकूल है। मुझे लगता है कि आपके उत्तर के साथ समस्या यह है कि आप आदेश अवधारणा और कक्षा प्रत्येक सूक्ष्म सेवा में समान होंगे लेकिन मुझे लगता है कि यह न तो आवश्यक है और न ही सटीक है।
रिबॉल्डएंडी

मैं असहमत नहीं हूं, ADM DDD हो सकता है यदि आप अपने PurchaseService CashRegister को कॉल करते हैं और इसे अपनी डोमेन भाषा का हिस्सा बनाते हैं
Ewan

क्या आप विस्तार से समझा सकते हैं? मैं हमेशा सोचता था कि YMMV जब ADM और DDD SOLID J2EE या .NET C # MVC EF कोड कोड में होते थे।
रिबेल्डैडी

मेरे कहने का मतलब यह है कि बाउंडेड संदर्भ आदेश, PurchaseSystemOrder.Purchase () CashRegister.Purchase (ऑर्डर ऑर्डर) के लिए समान रूप से समान कोड होगा जो कि आपकी डोमेन भाषा में नामकरण परिवर्तन है। एक समृद्ध डोमेन मॉडल का अर्थ है कि एक ही वर्ग पर खरीद और रद्द दोनों तरीके।
इवान

1
@RibaldEddie, "javaScript, अच्छे हिस्से" पुस्तक की मोटाई की नस में, मैं इस छवि को एक (पूरी तरह से गंभीर नहीं) तर्क के रूप में प्रस्तुत करता हूं कि माइक्रोसॉर्फ़िस को लागू करने के लिए DDD का उपयोग करने के खिलाफ;)
डेविड अर्नो

3

SOLID और DDD एक दूसरे के लिए रूढ़िवादी हैं, जिसका अर्थ है कि वे वास्तव में एक दूसरे से अलग दिशाओं में जा रहे हैं। आपको यह नहीं कहना चाहिए कि एक का उपयोग दूसरे के बहिष्कार के लिए किया जाता है, क्योंकि वे संभवतः एक ही कोडबेस में एक साथ मौजूद हो सकते हैं।

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

डीडीडी सूक्ष्म सेवाओं के लिए बाध्य संदर्भ अवधारणा के कारण एक उत्कृष्ट प्रतिमान है ।

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

ठोस सिद्धांत सामान्य ओओपी अवधारणाओं का एक सेट है जिसका उपयोग आप बेहतर ओओपी कोड बनाने के लिए कर सकते हैं। आप उनका उपयोग करके एक अच्छा DDD कोडबेस लिख सकते हैं।


डोमेन से इंफ्रास्ट्रक्चर कोड को अलग करने के संबंध में। अब तक मैंने JPA संस्थाओं को अपना डोमेन माना था, जिसमें निम्न अनुप्रयोग परतें थीं: नियंत्रक -> सेवा -> रिपॉजिटरी -> डोमेन (JPA Entities)। मॉडलिंग का सही (या सही में से एक) तरीका क्या होगा जो आपकी बात को सच कर दे? कुछ इस तरह: नियंत्रक -> अमीर मॉडल -> x? मैं लेन-देन से कैसे और कहां निपटूंगा? और जेपीए मैपिंग का क्या? क्या हमें अलग JPA संस्थाओं के साथ अपने समृद्ध मॉडल की नकल नहीं करनी होगी?
codependent

एक जेपीए इकाई एक सादे पुराने जावा ऑब्जेक्ट है। मैपिंग इंफ्रास्ट्रक्चर का हिस्सा है, लेकिन खुद क्लास को होना जरूरी नहीं है। यदि आप इसे बुनियादी ढांचे के हिस्से के रूप में मानते हैं, तो आपको इसे एक डाटा ट्रांसफर ऑब्जेक्ट के रूप में माना जाना चाहिए जो कि डोमेन एंटिटी बनाने के लिए फैक्टरी या रिपॉजिटरी में उपयोग किया जाता है।
रिबेल्डएडीडी

1

एक अच्छा डोमेन अच्छा होने पर अच्छा होता है। एक बुरा सपना जब नहीं। एनीमिक डोमेन हमेशा खराब होता है। लेकिन इसका एक परिचित आरामदायक प्रकार का बुरा है।

यदि एक एनीमिक डोमेन है, तो आप कभी भी चाहते हैं कि जब आप सामान्य प्रयोजन की भाषा चुनते हैं तो आपने गलत भाषा को चुना। चौथी पीढ़ी की भाषाएँ एक विशिष्ट उपयोग के आसपास होती हैं। यदि एनीमिक काफी अच्छा है तो उनका उपयोग करने से आपका जीवन आसान हो जाएगा।

जब तक आप जॉब के रूप में जॉब का विज्ञापन नहीं कर सकते, तब तक कई चौखटे भाषा स्थान में अपना रास्ता बना लेते हैं। यह जावा / स्प्रिंग का काम है। वे क्या कर रहे हैं, इसके अलावा आप उन पर निर्भर करते हैं, एक सामान्य प्रयोजन की भाषा को 4 वीं पीढ़ी की भाषा के रूप में बदल देते हैं।

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

अगर आपके साथ ठीक है तो ठीक है। आप निश्चित रूप से केवल एक ही नहीं हैं।

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

मेरे पास सामान के लिए मेरे कोड बेस में कोई जगह नहीं है, जिसकी आवश्यकता नहीं है।

के रूप में SOLID और अन्य डिजाइन सिद्धांतों के लिए मैं काफी हद तक उन लोगों को भी anemic डोमेन में पालन कर सकते हैं। उनका पालन नहीं करने से एक अलग तरह की समस्या पैदा होती है।


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

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

मूल बिंदु पर वापस जा रहे हैं। SOLID सिद्धांतों के बारे में क्या? रिच डोमेन मॉडल कई जिम्मेदारियों, दृढ़ता (जेपीए), व्यावसायिक तर्क (लेन-देन से निपटने के लिए), आदि का अनुमान लगाते हैं। दूसरी तरफ एनीमिक मॉडल केवल व्यवसाय तर्क के साथ काम करने वाली अलग सेवाओं की दृढ़ता के बारे में परवाह करते हैं। सुनने में भी आसान लगता है। फिर इसमें गलत क्या है?
कोडेंडेंडेंट

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

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