हम व्यापार तर्क के प्रतिनिधिमंडल और इनकैप्सुलेशन के बीच की रेखा कहां खींचते हैं? यह मुझे लगता है कि हम जितना अधिक प्रतिनिधि करेंगे, हम उतने ही अधिक एनीमिक बनेंगे। हालांकि, प्रतिनिधिमंडल ने पुन: उपयोग और DRY प्रमुख को भी बढ़ावा दिया। तो क्या प्रतिनिधि के लिए उपयुक्त है और हमारे डोमेन मॉडल में क्या रहना चाहिए?
उदाहरण के रूप में निम्नलिखित चिंताओं को लें:
प्राधिकरण । क्या डोमेन ऑब्जेक्ट को उसके एक्सेस कंट्रोल रूल्स (जैसे कि कैनडिट प्रॉपर्टी) को बनाए रखने के लिए ज़िम्मेदार होना चाहिए या इसे किसी अन्य कंपोनेंट / सर्विस को एक्सेस करने के लिए पूरी तरह से ज़िम्मेदार ठहराया जाना चाहिए, जैसे IAuthorizationService.CanEdit (ऑब्जेक्ट)? या फिर दोनों का मेल होना चाहिए? शायद डोमेन ऑब्जेक्ट में एक CanEdit गुण है जो वास्तविक कार्य करने के लिए एक आंतरिक IAuthorizationService को दर्शाता है?
मान्यता । जैसा कि ऊपर चर्चा वैधीकरण से संबंधित है। कौन नियमों का पालन करता है और कौन उनका मूल्यांकन करने के लिए जिम्मेदार है? एक ओर, वस्तु की स्थिति उस वस्तु से संबंधित होनी चाहिए और वैधता एक राज्य है लेकिन हम हर डोमेन ऑब्जेक्ट के लिए नियमों का मूल्यांकन करने के लिए उपयोग किए गए कोड को फिर से लिखना नहीं चाहते हैं। हम इस मामले में विरासत का उपयोग कर सकते हैं ...
वस्तु निर्माण । फैक्ट्री क्लास बनाम फैक्ट्री के तरीके बनाम एक नया उदाहरण। यदि हम एक अलग कारखाना वर्ग का उपयोग करते हैं, तो हम निर्माण तर्क को अलग करने और उसका एनकैप करने में सक्षम हैं, लेकिन कारखाने में अपनी वस्तु की स्थिति को खोलने की कीमत पर। इसका प्रबंधन तब किया जा सकता है जब हमारे डोमेन की परत कारखाने द्वारा उपयोग किए गए आंतरिक कंस्ट्रक्टर को उजागर करके एक अलग विधानसभा में होती है, लेकिन कई निर्माण पैटर्न होते हैं तो यह एक समस्या बन जाती है। और, अगर सारा कारखाना सही निर्माणकर्ता को बुला रहा है, तो कारखाने के होने की क्या बात है?
कक्षा में फैक्ट्री के तरीके ऑब्जेक्ट की आंतरिक स्थिति को खोलने के साथ समस्या को समाप्त करते हैं, लेकिन चूंकि वे स्थिर हैं, इसलिए हम एक कारखाने इंटरफ़ेस के इंजेक्शन के माध्यम से निर्भरता को तोड़ने में सक्षम नहीं हैं, जैसे कि हम एक अलग कारखाने वर्ग के साथ कर सकते हैं।
दृढ़ता । कोई यह तर्क दे सकता है कि यदि हमारी डोमेन ऑब्जेक्ट किसी अन्य पार्टी (IAuthorizationService) को प्राधिकरण जांच करने की जिम्मेदारी सौंपते हुए CanEdit को उजागर करने जा रही है, तो हमारे डोमेन ऑब्जेक्ट पर एक सहेजें विधि क्यों नहीं है जो एक ही काम करती है? इससे हमें यह निर्धारित करने के लिए ऑब्जेक्ट की आंतरिक स्थिति का मूल्यांकन करने की अनुमति मिलती है कि क्या ऑपरेशन को बिना एनकैप्सुलेशन के तोड़ा जा सकता है। निश्चित रूप से यह आवश्यक है कि हम अपने डोमेन ऑब्जेक्ट में रिपॉजिटरी इंस्टेंस को इंजेक्ट करें, जो मुझे थोड़ा बदबू देता है, इसलिए क्या हम इसके बजाय एक डोमेन इवेंट बढ़ाते हैं और एक हैंडलर को हठ ऑपरेशन करने की अनुमति देते हैं?
देखें कि मैं इसके साथ कहाँ जा रहा हूँ?
रॉकफोर्ड लोटका ने अपने CSLA ढांचे के लिए क्लास-इन-चार्ज मार्ग पर जाने के अपने कारणों के बारे में एक महान चर्चा की है और मेरे पास उस ढांचे के साथ थोड़ा सा इतिहास है और वह कई तरह से डोमेन ऑब्जेक्ट्स को पार्ले करने के लिए व्यावसायिक वस्तुओं के अपने विचार को देख सकता है। लेकिन अच्छे DDD आदर्शों का अधिक पालन करने की कोशिश कर रहा हूं, मैं सोच रहा हूं कि जब सहयोग बहुत अधिक हो जाए।
अगर मैं अपने कुल रूट के लिए IAuthorizationService, IValidator, IFactory और IRepository के साथ समाप्त होता हूं, तो क्या बचा है? क्या कोई प्रकाशित विधि है, जो कक्षा को एक गैर-एनीमिक डोमेन ऑब्जेक्ट पर विचार करने के लिए ड्राफ्ट से प्रकाशित की गई वस्तु की स्थिति को बदल देती है?
तुम्हारे विचार?