DDD और मान ऑब्जेक्ट। क्या नॉन एग्री के लिए एक अच्छे उम्मीदवार के लिए म्यूटेबल ऑब्जेक्ट ऑब्जेक्ट हैं। रूट एंटिटी?


9

यहाँ थोड़ी समस्या है

एक इकाई है, एक मूल्य वस्तु के साथ। एक समस्या नहीं है। मैं एक नए के लिए एक मान ऑब्जेक्ट को प्रतिस्थापित करता हूं, फिर nberberate नए मूल्य को सम्मिलित करता है और पुराने को अनाथ करता है, फिर उसे हटा देता है। ठीक है, यह एक समस्या है।

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

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

इस मामले में आप मुझे क्या सुझाव देंगे? जिस तरह से मैं इसे देखता हूं, ValueObjects केवल तब उपयोगी होते हैं जब आप डेटाबेस टेबल के कॉलम (nhibernate में घटक) के एक समूह को इनकैप्सुलेट करना चाहते हैं। सब कुछ है कि डेटाबेस में एक दृढ़ता आईडी है, यह एक इकाई (जरूरी नहीं कि एक मूल जड़) बनाने के लिए बेहतर है ताकि आप पूरे ऑब्जेक्ट ग्राफ को फिर से बनाए बिना अपने सदस्यों को अपडेट कर सकें, खासकर अगर यह एक गहरी नेस्टेड ऑब्जेक्ट है।

क्या आप कंसर्न करते हैं? क्या यह श्री इवांस द्वारा एक परिवर्तनशील मूल्य वस्तु रखने की अनुमति है? या एक परस्पर मूल्य वस्तु एक इकाई के लिए एक उम्मीदवार है?

धन्यवाद


2
क्या "परस्पर मूल्य वस्तु" जैसी कोई चीज है? मैं हमेशा धारणा मूल्य वस्तुओं अपरिवर्तनीय थे।
इसके बाद

@herby मुझे लगता है कि आप कोड में DDD मान ऑब्जेक्ट का प्रतिनिधित्व करने वाली एक उत्परिवर्तित वस्तु हो सकते हैं, लेकिन आपको यह विचार करना होगा कि एक बार जब आप वस्तु को उत्परिवर्तित करते हैं, तो यह उसी तार्किक DDD मान ऑब्जेक्ट को संदर्भित नहीं कर रहा है, लेकिन एक नया है। यह वांछनीय हो सकता है लेकिन यह भ्रम की भावना के लिए एक नुस्खा है - मूल्य वस्तुओं को कोड में अपरिवर्तनीय बनाना एक स्मार्ट सम्मेलन है।
मैटवेवी

जवाबों:


8

हर चीज की एक पहचान होनी चाहिए एक इकाई, और एक पहचान नहीं है कि सब कुछ एक साधारण मूल्य है, इसलिए एक मूल्य वस्तु है।

मार्टिन फाउलर को उद्धृत करने के लिए (जो बदले में एरिक इवांस को छोड़कर)

  • इकाई: ऐसी वस्तुएँ जिनकी एक अलग पहचान होती है जो समय और विभिन्न अभ्यावेदन के माध्यम से चलती हैं। आप इन्हें "रेफरेंस ऑब्जेक्ट्स" भी कहते हैं।
  • मूल्य वस्तु: ऐसी वस्तुएं जो केवल उनके गुणों का संयोजन होती हैं।

अपने पते को एक वैल्यू ऑब्जेक्ट बनाने का कारण:

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

MailingHistory प्रविष्टि हमने 657 को संबोधित करने के लिए A764 को भेज दिया है, जिसका अर्थ है कि हमने कल आर्टिकल A764 को बोस्टन भेज दिया और कल हमने A764 लेख को न्यूयॉर्क भेज दिया

यदि मेलिंग पता बदल दिया गया है, तो पुराने को हटाने की कोई आवश्यकता नहीं है । इसे रखें, और इसे निष्क्रिय के रूप में चिह्नित करें , और नया सक्रिय के रूप में ।


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

यदि आप सुनिश्चित हैं कि आप यह सुनिश्चित कर सकते हैं कि एक इकाई का उपयोग करना संभव होगा।


लेकिन सबसे अच्छा समाधान आईएमएचओ आपके मेलिंग इतिहास में एक एड्रेस एंटिटी को संदर्भित नहीं करना है, बल्कि सीधे अपने मेलिंग हिस्ट्री टेबल में मूल पते को सेव करना है (मूल रूप से एड्रेस के डेटा को कॉपी करना)।

इस तरह, आप हमेशा जानते हैं कि आपने अपना सामान कहां भेज दिया है (या आप जो भी मेल कर रहे हैं), और चूँकि आप एक उत्परिवर्ती इकाई का उपयोग करेंगे, इसलिए आपकी पता तालिका को बंद नहीं किया जाएगा।

मैंने कई ईआरपी सिस्टम पर / के साथ काम किया है, और उनमें से लगभग सभी ने इस दृष्टिकोण का उपयोग किया है।

आपके डेटाबेस में कुछ अतिरेक होगा, लेकिन यह सबसे व्यावहारिक तरीका है IMHO।


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

@ टिमो "हमेशा नवीनतम पते / फोन / ई-मेल से जुड़ता है" यह मुश्किल नहीं है यदि आप अपने डेटा को केवल active-फ्लैग जोड़कर थोड़ा बढ़ाते हैं। निश्चित रूप से आपको and active = trueअपने जोड़ों में हमेशा उपयोग करना सुनिश्चित करना होगा , ध्वज को अप-टू-डेट रखें और अपनी मेज पर एक कोंट्रेक्ट जोड़ दें ताकि प्रत्येक ग्राहक के लिए केवल एक ई-मेल हो, इस ध्वज को सही पर सेट किया जा सके।
स्लॉथ

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

2

मैं 2 चीजें देखता हूं:

  1. क्या इतिहास के रिकॉर्ड को प्रभावित करने के लिए ज़िप कोड बदलना ठीक है? मुझे लगता है कि इतिहास के रिकॉर्ड के लिए पुराने, अपरिवर्तित पते को इंगित करना तर्कसंगत होगा, इसलिए आप जानते हैं कि आप इसे गलत पते पर भेजते हैं।

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


2

IMO एड्रेस ऑब्जेक्ट आपके डोमेन की एक इकाई है। यह कई संस्थाओं द्वारा साझा किया गया है, इसकी अपनी पहचान है और यह प्रणाली के लिए अद्वितीय है।

इवांस कहते हैं:

मुख्य रूप से इसकी पहचान से परिभाषित एक वस्तु को एक इकाई कहा जाता है।


डोमेन पहचान, मेरी समझ के लिए, दृढ़ता पहचान से कोई लेना-देना नहीं है। श्री इवान की पुस्तक के अनुसार।
पेपिटो फर्नांडीज

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

1
"पता वस्तु ... इसकी अपनी पहचान है" - एक पते की कौन सी विशेषता इसकी विशिष्ट पहचान करती है? एक पते की कोई भी विशेषता अद्वितीय नहीं है, लेकिन विशेषताओं का संयोजन पहचान के रूप में कार्य करता है। यह एक मान ऑब्जेक्ट
MattDavey

@MattDavey: यह एक अच्छा निष्कर्ष है, लेकिन जब टोनी कहता है कि "हम पंक्ति को हटाना नहीं चाहते हैं, तो मैं भ्रमित हो जाता हूं, क्योंकि उस पते का पीके एक मेलिंगहॉस्टर टेबल में एक एफके है"। मेरे लिए इसका मतलब यह है कि एड्रेस ऑब्जेक्ट का एग्रीगेट 'इंश्योरड' के बाहर भी अर्थ है। जो मुझे इंगित करता है कि 'पता' ऑब्जेक्ट एक ValueObject नहीं होना चाहिए। तुम क्या सोचते हो?
मर्गबित

क्या हम यह कह सकते हैं कि मूल्य वस्तुएं मूल रूप से माता-पिता की पूर्ण स्वामित्व वाली रचना (UML) होगी? इसके अतिरिक्त एक मूल्य वस्तु अपने माता पिता के बिना कोई मतलब नहीं होगा और माता-पिता के बीच साझा नहीं किया जा सकता है?
सुदर्शन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.