इन सभी सेवाओं के साथ, मैं एनीमिक कैसे नहीं हो सकता हूं?


90

हम व्यापार तर्क के प्रतिनिधिमंडल और इनकैप्सुलेशन के बीच की रेखा कहां खींचते हैं? यह मुझे लगता है कि हम जितना अधिक प्रतिनिधि करेंगे, हम उतने ही अधिक एनीमिक बनेंगे। हालांकि, प्रतिनिधिमंडल ने पुन: उपयोग और DRY प्रमुख को भी बढ़ावा दिया। तो क्या प्रतिनिधि के लिए उपयुक्त है और हमारे डोमेन मॉडल में क्या रहना चाहिए?

उदाहरण के रूप में निम्नलिखित चिंताओं को लें:

प्राधिकरण । क्या डोमेन ऑब्जेक्ट को उसके एक्सेस कंट्रोल रूल्स (जैसे कि कैनडिट प्रॉपर्टी) को बनाए रखने के लिए ज़िम्मेदार होना चाहिए या इसे किसी अन्य कंपोनेंट / सर्विस को एक्सेस करने के लिए पूरी तरह से ज़िम्मेदार ठहराया जाना चाहिए, जैसे IAuthorizationService.CanEdit (ऑब्जेक्ट)? या फिर दोनों का मेल होना चाहिए? शायद डोमेन ऑब्जेक्ट में एक CanEdit गुण है जो वास्तविक कार्य करने के लिए एक आंतरिक IAuthorizationService को दर्शाता है?

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

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

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

दृढ़ता । कोई यह तर्क दे सकता है कि यदि हमारी डोमेन ऑब्जेक्ट किसी अन्य पार्टी (IAuthorizationService) को प्राधिकरण जांच करने की जिम्मेदारी सौंपते हुए CanEdit को उजागर करने जा रही है, तो हमारे डोमेन ऑब्जेक्ट पर एक सहेजें विधि क्यों नहीं है जो एक ही काम करती है? इससे हमें यह निर्धारित करने के लिए ऑब्जेक्ट की आंतरिक स्थिति का मूल्यांकन करने की अनुमति मिलती है कि क्या ऑपरेशन को बिना एनकैप्सुलेशन के तोड़ा जा सकता है। निश्चित रूप से यह आवश्यक है कि हम अपने डोमेन ऑब्जेक्ट में रिपॉजिटरी इंस्टेंस को इंजेक्ट करें, जो मुझे थोड़ा बदबू देता है, इसलिए क्या हम इसके बजाय एक डोमेन इवेंट बढ़ाते हैं और एक हैंडलर को हठ ऑपरेशन करने की अनुमति देते हैं?

देखें कि मैं इसके साथ कहाँ जा रहा हूँ?

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

अगर मैं अपने कुल रूट के लिए IAuthorizationService, IValidator, IFactory और IRepository के साथ समाप्त होता हूं, तो क्या बचा है? क्या कोई प्रकाशित विधि है, जो कक्षा को एक गैर-एनीमिक डोमेन ऑब्जेक्ट पर विचार करने के लिए ड्राफ्ट से प्रकाशित की गई वस्तु की स्थिति को बदल देती है?

तुम्हारे विचार?


बड़ा सवाल है। मेरे पास आपके लिए कोई जवाब नहीं है क्योंकि मैं लगभग हमेशा एक ही कारण के लिए डिजाइन में पूरी तरह से एनीमिक को समाप्त करता हूं - कई अलग-अलग संदर्भों या विभिन्न अनुप्रयोगों के लिए / से / से सेवाओं का उपयोग / उपभोग करना।
हरमनो

बहुत अच्छा सवाल है, इस पर चाचा, मार्टिनफॉवलर, एरीस्वांस एट अल से झंकार देखना पसंद करेंगे। अब मेरे लिए दूर जाना और एक लंबा विचार करना है
मार्टिजेन वर्बर्ग

मैं अपने आप को हर समय एनीमिक मॉडल के लिए विकसित पाता हूं; और इसलिए मैं इस एक ही बात से जूझ रहा हूं। बड़ा अच्छा सवाल!
एल-फोर

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

यहाँ कुछ जब व्यवहार (गैर डेटा केंद्रित) के नजरिए से डोमेन मॉडलिंग इस्तेमाल तकनीक का एक उदाहरण है medium.com/@wrong.about/...
Zapadlo

जवाबों:


66

अधिकांश भ्रम कार्यक्षमता के आसपास लगता है जो डोमेन मॉडल में बिल्कुल भी मौजूद नहीं होना चाहिए:

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

  • प्राधिकरण आमतौर पर आपके डोमेन मॉडल का हिस्सा नहीं है , जब तक कि यह वास्तव में डोमेन का हिस्सा नहीं है, जैसे कि यदि आप सुरक्षा सॉफ़्टवेयर लिख रहे हैं। सामान्य रूप से व्यवसाय या डोमेन टियर के "किनारे" पर एक अनुप्रयोग में जो कुछ भी करने की अनुमति है, उन्हें प्रदर्शन करने की अनुमति देने वाले यांत्रिकी, सार्वजनिक भागों कि UI और एकीकरण के टुकड़ों को वास्तव में बात करने की अनुमति है - MVC में नियंत्रक, सेवाएँ या SOA में ही मैसेजिंग सिस्टम ... आपको चित्र मिल जाएगा।

  • कारखानों (और मुझे लगता है कि आप यहाँ अमूर्त कारखानों का मतलब है) एक डोमेन मॉडल में होने के लिए बिल्कुल खराब नहीं हैं, लेकिन वे लगभग हमेशा अनावश्यक हैं। आम तौर पर आपके पास केवल एक कारखाना होता है जब वस्तु निर्माण के आंतरिक यांत्रिकी बदल सकते हैं। लेकिन आपके पास केवल डोमेन मॉडल का एक कार्यान्वयन है, जिसका अर्थ है कि केवल एक ही प्रकार का कारखाना होगा जो हमेशा एक ही निर्माता और अन्य आरंभीकरण कोड को आमंत्रित करता है।

    यदि आप चाहते हैं तो आपके पास "सुविधा" कारखाने हो सकते हैं - कक्षाएं जो कि निर्माण मापदंडों और इसी तरह के सामान्य संयोजनों को जोड़ती हैं - लेकिन ईमानदारी से, आम तौर पर बोलें, तो यदि आपके डोमेन मॉडल में बहुत सारे कारखाने बैठे हैं, तो आप बस लाइनों को बर्बाद कर रहे हैं कोड का।

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

सत्यापन आपके डोमेन मॉडल का हिस्सा है, लेकिन यह एप्लिकेशन के हर दूसरे घटक का भी हिस्सा है। आपके यूआई और डेटाबेस का अपना एक समान वैयक्तिकृत मॉडल के आधार पर अलग-अलग सत्यापन नियम होंगे। यह वास्तव में निर्दिष्ट नहीं है कि वस्तुओं को एक Validateविधि की आवश्यकता है या नहीं, लेकिन फिर भी यदि वे करते हैं, तो वे इसे आमतौर पर एक सत्यापनकर्ता वर्ग को सौंपेंगे (इंटरफ़ेस नहीं - डोमेन मॉडल में सत्यापन सार नहीं है , यह मौलिक है)।

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

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

अंगूठे के नियम के रूप में, यह विचार करते समय कि डोमेन मॉडल में कुछ है या नहीं, अपने आप से निम्नलिखित प्रश्न पूछें:

"क्या यह कार्यक्षमता कभी विशुद्ध रूप से तकनीकी कारणों से बदल सकती है?" दूसरे शब्दों में, वास्तविक दुनिया के व्यापार या डोमेन के लिए किसी भी अवलोकन परिवर्तन के कारण नहीं?

यदि उत्तर "हां" है, तो यह डोमेन मॉडल में नहीं है। यह डोमेन का हिस्सा नहीं है।

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

अगर, आपके द्वारा कोई भी सामान छीनने के बाद, जो मायने नहीं रखता है, तो आप पाते हैं कि डोमेन मॉडल वास्तव में एनीमिक है , तो यह एक बहुत अच्छा संकेत है कि DDD बस आपकी परियोजना के लिए गलत प्रतिमान है।

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

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


2
इसके अलावा, @SonOfPirate, यह पूरी तरह से संभावना नहीं है कि आप अपने संपूर्ण सुरक्षा मॉडल को कुछ समय में बदलना चाहते हैं; भूमिका-आधारित सुरक्षा अक्सर दावों के पक्ष में मान ली जाती है- या अधिकार-आधारित सुरक्षा या शायद आप क्षेत्र-स्तरीय सुरक्षा भी चाहते हैं। यदि ऐसा हुआ तो अपने पूरे डोमेन मॉडल को फिर से बनाने की कोशिश करने की कल्पना करें।
आरोनॉट

1
@SonOfPirate: यह लगभग ऐसा लगता है कि आप अभी भी पुराने "बिजनेस टियर" मॉडल पर थोड़े अटके हुए हैं, जिसमें एक "मिडिल टियर" था जो मूल रूप से डेटा लेयर पर एक पतली लिबास था, जो विभिन्न व्यावसायिक नियमों को लागू करता था और सुरक्षा नियम भी। । डोमेन परत क्या है यह नहीं है। डोमेन वह है जो बाकी सब कुछ निर्भर करता है, यह वास्तविक दुनिया की वस्तुओं और रिश्तों का प्रतिनिधित्व करता है जो सिस्टम को प्रबंधित करने के लिए है।
आरोनोटेड

1
@ LaurentBourgault-Roy: क्षमा करें, मुझे आप पर विश्वास नहीं है। हर कंपनी कह सकती है कि हर एप्लिकेशन के बारे में; सब के बाद, एक डेटाबेस से बदल रहा है मुश्किल। यह इसे आपके डोमेन का हिस्सा नहीं बनाता है, और व्यवसाय तर्क जो दृढ़ता परत के लिए युग्मित है इसका मतलब है कि केवल खराब अमूर्तता है। एक डोमेन मॉडल व्यवहार पर केंद्रित है, जो वास्तव में दृढ़ता नहीं है । यह ऐसा विषय नहीं है जिस पर लोग अपनी-अपनी परिभाषाएँ बना सकें; यह डीडीडी में स्पष्ट रूप से स्पष्ट है। आपको अक्सर CRUD या रिपोर्टिंग ऐप्स के लिए एक डोमेन मॉडल की आवश्यकता नहीं होती है, लेकिन आपको यह भी दावा नहीं करना चाहिए कि आपके पास एक है जब आप नहीं करते हैं।
Aaronaught

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

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

6

प्राधिकरण। क्या डोमेन ऑब्जेक्ट को उसके एक्सेस कंट्रोल नियमों को बनाए रखने के लिए जिम्मेदार होना चाहिए

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

ऑथराइजेशन स्ट्रैटेजीज़ को लेयर में (यूआई में और आगे सर्विस या कमांड हैंडलर में) शेयर करना आसान होता है, जब ऑथराइज़ेशन को डोमेन मॉडल से अलग किया जाता है।

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

मान्यकरण। जैसा कि ऊपर चर्चा वैधीकरण से संबंधित है।

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

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

मैं कुछ समान वर्गों में कुछ संपत्तियों की नकल करना चाहूंगा जैसे कि मेरी संस्थाओं में सत्यापन ढांचे के लिए आवश्यकताओं को लागू करने की कोशिश करना। यह अनिवार्य रूप से इकाई वर्गों की गड़बड़ी को समाप्त करता है।

वस्तु निर्माण। फैक्ट्री क्लास बनाम फैक्ट्री के तरीके बनाम एक नया उदाहरण।

मैं अप्रत्यक्ष की एक परत का उपयोग करता हूं। मेरी हाल की परियोजनाओं में, यह कुछ बनाने के लिए एक कमांड + हैंडलर है, अर्थात CreateNewAccountCommand। एक विकल्प हमेशा एक कारखाने का उपयोग करने के लिए हो सकता है (हालांकि यह अजीब हो सकता है यदि बाकी इकाइयां संचालन एक सेवा वर्ग द्वारा उजागर की जाती हैं जो कारखाने वर्ग से अलग है)।

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

हठ। ... हमारे डोमेन ऑब्जेक्ट पर एक सहेजें विधि क्यों नहीं है

यह शायद ही एक अच्छा विचार है; मुझे लगता है कि इसका समर्थन करने के लिए काफी साझा अनुभव है।

अगर मैं अपने कुल रूट के लिए IAuthorizationService, IValidator, IFactory और IRepository के साथ समाप्त होता हूं, तो क्या बचा है? क्या एक प्रकाशित विधि है जो कक्षा को एक गैर-एनीमिक डोमेन ऑब्जेक्ट पर विचार करने के लिए ड्राफ्ट से प्रकाशित की गई वस्तु की स्थिति को बदल देती है ???

शायद एक डोमेन मॉडल आपके आवेदन के इस हिस्से के लिए सही विकल्प नहीं है।


2
"एक मुश्किल हिस्सा जिसका सामना किया जा सकता है, वह प्रासंगिक प्राधिकरण है, जहां एक कमांड न केवल उपयोगकर्ता की भूमिकाओं पर आधारित हो सकती है, बल्कि व्यावसायिक डेटा / नियम भी हो सकती है।" - और आप यह कैसे करते हैं? अधिक बार नहीं, मेरे लिए कम से कम, हमारे प्राधिकरण नियम भूमिका और वर्तमान स्थिति का एक संयोजन हैं।
SonOfPirate

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

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

4
यहाँ स्वयं ही उत्तर देना: मैंने स्टेटमेंट को उन अनुमतियों से निपटने के लिए बहुत उपयोगी पाया है जो अनुमतियों और व्यावसायिक नियमों दोनों पर निर्भर हैं। एक सार स्थिति बनाएं जो डोमेन मॉडल में अंतःक्षिप्त हो जाती है और उन तरीकों को उजागर करती है जो डोमेन ऑब्जेक्ट को पैरामीटर के रूप में लेते हैं और डोमेन-विशिष्ट कार्यों को मान्य करते हैं। इस तरह अगर आपकी अनुमति के नियम बदल जाते हैं (जैसा कि वे लगभग हमेशा करते हैं), तो आपको इसे समायोजित करने के लिए मॉडल के साथ कभी भी गड़बड़ नहीं करना चाहिए, क्योंकि राज्य कार्यान्वयन आपके सुरक्षा घटक में रहते हैं।
Aaronaught

1
प्राधिकरण के विषय पर बने रहने दें, मुझे टेबल पर एक ठोस उदाहरण फेंकने दें, यह देखने के लिए कि आप (दोनों) इसे कैसे संभालेंगे। मेरे पास मेरे डोमेन ऑब्जेक्ट पर प्रकाशित ऑपरेशन है जिसके लिए उपयोगकर्ता को प्रकाशक की भूमिका में होना चाहिए और वह वस्तु एक निश्चित स्थिति में है। मैं UI में प्रकाशित "बटन" को छिपाना या अक्षम करना चाहता हूं। आप इसे कैसे पूरा करेंगे?
SonOfPirate

4

ठीक है, यहाँ मेरे लिए जाता है। मैं यह कहकर इसे खाली कर दूंगा:

  • समय से पहले अनुकूलन (और जिसमें डिजाइन शामिल है) अक्सर समस्याएं पैदा कर सकता है।

  • IANMF (मैं मार्टिन फाउलर नहीं हूं);)

  • एक छोटा सा रहस्य यह है कि छोटे आकार की परियोजनाओं पर (यहां तक ​​कि निश्चित रूप से मध्यम आकार वाले), यह आपके दृष्टिकोण की स्थिरता है जो मायने रखेगा।

प्राधिकरण

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

मान्यकरण मेरे लिए सत्यापन वस्तु का हिस्सा है, जैसा कि मैं इसे परिभाषित करता हूं कि वस्तु क्या है।

उदा ए कार ऑब्जेक्ट में 4 पहिए होते हैं (ठीक है कुछ अजीब अपवाद हैं, लेकिन अब के लिए अजीब 3 पहिए वाली कार को अनदेखा करते हैं)। जब तक 4 (मेरी दुनिया में) नहीं है, तब तक एक कार वैध नहीं होती है, इसलिए यह मान्यता है कि कार की परिभाषा क्या है। इसका मतलब यह नहीं है कि आपके पास सहायक सत्यापन कक्षाएं नहीं हो सकती हैं।

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

वस्तु निर्माण

मैं फैक्ट्री की कक्षाओं को सावधानी से देखता हूं। बहुत बार मैंने xyxFactoryFactoryकक्षा देखी है ;)

मैं सिर्फ एक बनाने के लिए करते हैं new, जब तक मैं एक मामले में जहां निर्भरता इंजेक्शन न्यायसंगत न हो (और के बाद से मैं एक TDD दृष्टिकोण पालन करने की कोशिश, यह तुलना में अक्सर आने करता है) में चलाने, वस्तु के रूप में की जरूरत है।

मेरे खुश जावा दुनिया में तेजी से गुइसे है, लेकिन वसंत अभी भी यहां का राजा है।

हठ

तो यह एक बहस है जो हलकों और राउंडअबाउट में चलती है और मैं हमेशा इसके बारे में दो दिमागों में हूं।

कुछ लोग कहते हैं कि यदि आप वस्तु को 'शुद्ध' तरीके से देखते हैं, तो दृढ़ता कोई मुख्य गुण नहीं है, यह केवल एक बाहरी चिंता है।

अन्य लोग यह देखते हैं कि आपके डोमेन ऑब्जेक्ट एक 'निरंतर-सक्षम' इंटरफ़ेस को लागू करते हैं (हाँ, मुझे पता है कि मैं यहाँ खींच रहा हूँ)। इसलिए, उन पर विभिन्न save, deleteआदि तरीकों का होना ठीक है । इसे एक व्यावहारिक दृष्टिकोण और कई ओआरएम प्रौद्योगिकियों (मेरी खुश जावा दुनिया में जेपीए) के रूप में इस तरह से वस्तुओं के साथ व्यवहार के रूप में देखा जाता है।

क्रॉस कटिंग सुरक्षा चिंता से मैं यह सुनिश्चित करता हूं कि एडिट / डिलीट / ऐड / जो भी अनुमतियाँ उस सेवा पर सही ढंग से सेट हैं जो ऑब्जेक्ट पर सेव / अपडेट / डिलीट मेथड को कॉल करता है। अगर मैं वास्तव में पागल हूँ तो मैं स्वयं भी डोमेन ऑब्जेक्ट पर अनुमतियाँ सेट कर सकता हूँ।

HTH!


2

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

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


एक विशिष्ट आवश्यकता की तरह लगता है - डेटा (तनाव 'डेटा') संरचना का पुन: उपयोग - सादे डीटीओ के लिए कम किए गए उस सामान्य हिस्से का नेतृत्व।
विक्टर सर्जेनको

एनीमिक मॉडल बेहतर पुन: उपयोग की अनुमति देते हैं? एक डीटीओ की तरह लगता है, और मैं व्यक्तिगत रूप से संपत्ति की परिभाषाओं के पुन: उपयोग के बारे में एक लानत नहीं देता। मैं बहुत अधिक व्यवहार का पुन: उपयोग करना चाहता हूं।
एंडी

@Andy - मैं इस बात से सहमत होता हूं कि यदि आपका व्यवहार डोमेन सेवाओं के भीतर है और वे एनीमिक ऑब्जेक्ट्स पर काम करते हैं (ठीक है डीटीओ यदि आप चाहें तो) तो उन व्यवहारों का पुन: उपयोग नहीं बढ़ाता है? सिर्फ शैतान का वकील खेल रहा है।
जिपरसन

@ जिपरसन मैंने पाया है कि व्यवहार आमतौर पर एक विशेष उपयोग के मामले के लिए विशिष्ट हैं। यदि पुन: उपयोग होता है, तो वह किसी अन्य वर्ग में होगा, लेकिन उपभोक्ता उन कक्षाओं का उपयोग नहीं करेगा, वे उपयोग मामले के लिए विशिष्ट का उपयोग करेंगे। इसलिए कोई भी पुन: उपयोग "पर्दे के पीछे" है, इसलिए बोलने के लिए। इसके अतिरिक्त, मॉडल का पुन: उपयोग करने का प्रयास आमतौर पर मॉडल को उपभोक्ता के लिए उपयोग करने के लिए कठिन बना देता है, इसलिए आप UI परत में दृश्य / संपादन मॉडल बनाते हैं। अक्सर तब आप एक अमीर उपयोगकर्ता अनुभव देने के लिए DRY का उल्लंघन करते हैं (उदाहरण के लिए, संपादन मॉडल के DataAnnotations)।
एंडी

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

2

यह प्रश्न बहुत पहले पूछा गया था, लेकिन इसे डोमेन ड्रिवेन डिज़ाइन के साथ टैग किया गया है। मुझे लगता है कि प्रश्न में ही पूरी प्रैक्टिस की एक बुनियादी गलतफहमी है और स्वीकार किए गए जवाब सहित उत्तर, एक बुनियादी गलतफहमी को खत्म करते हैं।

DDD आर्किटेक्चर में कोई "डोमेन मॉडल" नहीं है।

एक उदाहरण के रूप में प्राधिकरण लेते हैं। मुझे एक प्रश्न के बारे में सोचने के लिए कहें: दो अलग-अलग उपयोगकर्ताओं को अपने सिस्टम के साथ प्रमाणित करने की कल्पना करें। एक उपयोगकर्ता के पास एक निश्चित इकाई को बदलने की अनुमति है, लेकिन दूसरा नहीं करता है। क्यों नहीं?

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

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

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

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

इसलिए शायद कोई प्राधिकरण के संदर्भ में एक गैर-एनेमिक डोमेन मॉडल पर विचार कर सकता है जो कम शिपमेंट या रूटिंग साइट विज़िटर के साथ स्टोर करने के लिए रूटिंग शू विज़िटर के संदर्भ में अलग-अलग लैंडिंग पृष्ठ पर उचित लैंडिंग पृष्ठ पर निर्भर करता है जिसके आधार पर वे विज्ञापन पर क्लिक करते हैं।

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

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