क्या अपरिवर्तनीय वस्तुएं और डीडीडी एक साथ चलते हैं?


18

एक प्रणाली पर विचार करें जो DDD का उपयोग करता है (साथ ही: कोई भी सिस्टम जो ORM का उपयोग करता है)। किसी भी प्रणाली का वास्तविक, लगभग हर उपयोग के मामले में, उन डोमेन ऑब्जेक्ट्स में हेरफेर करना होगा। अन्यथा कोई वास्तविक प्रभाव या उद्देश्य नहीं है।

एक अपरिवर्तनीय वस्तु को संशोधित करने से ऑब्जेक्ट के बने रहने के बाद एक नया रिकॉर्ड बन जाएगा, जो डेटा स्रोत में बड़े पैमाने पर ब्लोट बनाता है (जब तक कि आप संशोधनों के बाद पिछले रिकॉर्ड को नहीं हटाते)।

मैं अपरिवर्तनीय वस्तुओं का उपयोग करने का लाभ देख सकता हूं, लेकिन इस अर्थ में, मैं कभी भी अपरिवर्तनीय वस्तुओं का उपयोग करने के लिए एक उपयोगी मामला नहीं देख सकता। क्या यह गलत है?


जवाबों:


16

अपरिवर्तनीय वस्तुओं (जैसा कि कार्यात्मक प्रोग्रामिंग में) का उपयोग करके गणना आवश्यक रूप से उत्पन्न होने वाली प्रत्येक वस्तु को जारी रखने का नहीं है!


मुझे ऐसा कोई उदाहरण दिखाई नहीं दे रहा है, जहाँ यह परिदृश्य अपरिवर्तनीय वस्तुओं का उपयोग वैसे भी करता है - इसलिए वे वहाँ किसी विशेष उद्देश्य के लिए नहीं होंगे। क्या मै गलत हु?
स्टीवन एवर्स

1
मैं सोच रहा था कि अपरिवर्तनीय वस्तुएँ मध्यवर्ती गणनाओं के लिए उपयोगी होंगी (समानांतर धागों में)
स्टीवन ए। लोवे

11

क्या डोमेन में अपरिवर्तनीय का मतलब है कि डेटाबेस में अपरिवर्तनीय होना चाहिए? उदाहरण के लिए निम्नलिखित मान लें कि ग्राहक का हमेशा एक पता होता है:

customer.address = new Address('My Castle', 'Kings street');
customer_repo.save(customer);

ग्राहक आईडी को देखते हुए अब निम्नलिखित एसक्यूएल चलाया जाता है:

INSERT INTO addresses (customer_id, name, street)
VALUES (1, 'My Castle', 'Kings street');

अब निम्नलिखित परिवर्तन पते पर किए गए हैं:

customer.address = new Address('Pauper palace', 'Outlands');
customer_repo.save(customer);

और दृढ़ता की परत, बहुत चालाक होने के कारण निम्न वर्ग चलता है:

UPDATE addresses SET name='Pauper palance', street='Outlands'
WHERE customer_id = 1;

इस तरह आप एक अलग DELETE और INSERT स्टेटमेंट के ओवरहेड से बचते हैं। इसके अलावा मुझे लगता है कि कुछ RDBMS के पास INSERT REPLACE या कुछ और है। MySql का REPLACE है


+1 मैं आपके सामान्य सिद्धांत पर सहमत हूं: मैं यह नहीं देखता कि अपरिवर्तनीय डोमेन ऑब्जेक्ट्स का अनिवार्य रूप से अपरिवर्तनीय DB पंक्तियों का अर्थ क्यों होना चाहिए।
एंड्रेस एफ।

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

1
@ सुदर्शन यह केवल 'अपरिवर्तनीय मूल्य वस्तु' बनाने का एक तरीका है, डेटाबेस में वास्तव में अपरिवर्तनीय नहीं है। प्रदर्शन कारणों से। प्रत्येक स्थिति को विशेष रूप से संभोग से निपटने की आवश्यकता है। मैं अब अपने डोमेन के लिए इवेंट सोर्सिंग पसंद करता हूं, लेकिन मैं इसका आदी हूं।
-हो

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

@andho "यह एक 'अपरिवर्तनीय मूल्य वस्तु' बनाने का एक तरीका है, डेटाबेस में वास्तव में अपरिवर्तनीय नहीं है।" इसने वास्तव में मेरे दिन को धन्यवाद दिया
सुदर्शन

6

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


4

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

मुझे लगता है, हालांकि यह एक कमजोर तर्क है, आप इस तरह से ऑडिट ट्रेल लागू कर सकते हैं। आवेषण के लिए हर परिवर्तन आवेषण के माध्यम से ट्रैक किया जा सकता है। हालांकि ऐसा करने के कई बेहतर तरीके हैं।

सभी में अपरिवर्तनीय डोमेन ऑब्जेक्ट्स (केवल उनके घटकों के बजाय) दृढ़ता के साथ एक बेमेल सा लगता है।


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

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

घटकों से बचें जब एक एकल इकाई पूरी तरह से एक पंक्ति द्वारा प्रस्तुत की जाती है और डेटा का कोई भी अन्य डोमेन ऑब्जेक्ट द्वारा साझा नहीं किया जाता है।
गैरी रोवे

4

जो कि डोमेन पर निर्भर करता है। DDD यह निर्दिष्ट नहीं करता है कि प्रोग्रामिंग प्रतिमान ऑब्जेक्ट ओरिएंटेड है। ऑब्जेक्ट ओरिएंटेड प्रतिमान ठेठ अनुप्रयोग के लिए एक अच्छी तरह से अनुकूल है जो एक डेटाबेस में बरकरार रहना चाहिए।

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

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

  • आपका कार्यान्वयन आपके समस्या डोमेन के एक डोमेन मॉडल का प्रतिनिधित्व नहीं करता है। इस मामले में आपकी समस्या डोमेन में संशोधन के लिए राज्य वाली इकाइयाँ हैं। और यह नहीं है कि आपने इसे कैसे लागू किया है।

  • आपके पास एक सर्वव्यापी भाषा नहीं है। डोमेन मॉडल में भाषा और अवधारणाएँ डोमेन विशेषज्ञों का उपयोग नहीं कर रही हैं।

नोट: डीडीडी अपरिवर्तनीय वस्तुओं का उपयोग करता है जहां उपयुक्त हैं, उन्हें केवल मूल्य ऑब्जेक्ट कहा जाता है।

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


पीटर, महान जवाब। क्या आप मेरे सवाल पर एक नज़र डाल सकते हैं यहां stackoverflow.com/questions/13783666/… और मुझे मेरी समस्या जानने में मदद करें। मुझे लगता है कि अपरिवर्तनीय मूल्य वस्तुएं सॉफ्टवेयर्स के लिए महान हैं जो उद्यम से संबंधित नहीं हैं। अधिकांश एंटरप्राइज़ एप्लिकेशन की वस्तुएं मेरी राय में भिन्न हैं। एक अपरिवर्तनीय डीप नेस्टेड मान ऑब्जेक्ट होने की कल्पना करें ... ContactInfo-> PhysicalLocation-> पता और आप ज़िपकोड को अपडेट करना चाहते हैं ... संपूर्ण ऑब्जेक्ट ग्राफ बनाना मुझे एंटीचिस्ट लगता है, न कि केवल एक एंटीपैटर्न। तुम क्या सोचते हो?
पेपिटो फर्नांडीज

3

यदि आप एक ORM का उपयोग कर रहे हैं जैसे कि हाइबरनेट / NHibernate तो आप अनाथ वस्तुओं को स्वचालित रूप से हटाने के लिए अपना कैस्केड विकल्प सेट कर सकते हैं। यदि किसी व्यक्ति का मान ऑब्जेक्ट पता है, जब आप पता बदलते हैं, तो नया सहेजा जाएगा और पुराना हटा दिया गया है क्योंकि यह अब अनाथ है।


0

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


-1

अपरिवर्तनीय वस्तुओं का उपयोग करने का एक और तरीका है ...

मान 5.0, 6.0, 7.0, 8.0 और हर बार पूरे रिकॉर्ड की प्रतिलिपि बनाने के बजाय, आप इसके बजाय कुछ इस तरह से स्टोर कर सकते हैं: 5.0, +1.0, +1.0, +1.0, और फिर अनुक्रम 5.0 को फिर से बनाने के लिए एक निर्भरता को सही ढंग से बनाएं। , 6.0, 7.0, 8.0 है। इस तरह छोटे संशोधन केवल स्मृति की छोटी राशि लेते हैं ...

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