किसी वस्तु को स्वयं की आईडी पता होनी चाहिए?


22

obj.idलगता है काफी सामान्य है और यह भी लगता है कि किसी वस्तु की सीमा के भीतर ही कोई वस्तु अपने बारे में जान सकती है। मैं खुद से पूछ रहा हूं कि मेरी वस्तु को अपनी आईडी क्यों जाननी चाहिए?

ऐसा लगता है कि यह करने के लिए एक कारण नहीं है? मौजूदा के मुख्य कारणों में से एक इसे पुनः प्राप्त करना है, और इसलिए मेरी रिपॉजिटरी को इसे जानने की आवश्यकता है, और इस प्रकार डेटाबेस इंटरैक्शन के लिए इसका उपयोग करें।

मुझे एक बार एक समस्या का भी सामना करना पड़ा जहाँ मैं JSON को एक RESTful API के लिए ऑब्जेक्ट को क्रमबद्ध करना चाहता था जहाँ आईडी पेलोड में फिट नहीं लगती थी, लेकिन ऑब्जेक्ट में केवल URI और इसे शामिल करने से यह और अधिक कठिन हो गया।

किसी वस्तु को पता होना चाहिए कि यह स्वयं की आईडी है? क्यों या क्यों नहीं?

अद्यतन : शर्तें

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

1
सार बने रहने के लिए, यदि जानकारी संग्रहीत करने का कोई कारण नहीं है, तो इसे संग्रहीत न करें। यह सिर्फ सिरदर्द पैदा करता है।

3
यदि आपको किसी वस्तु की अद्वितीय कुंजी का पता नहीं है तो आप डेटाबेस में डेटा को कैसे अपडेट करेंगे या उपयोगकर्ता को किसी सूची से एक घटना का चयन करने देंगे?
नोकझोंक

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

यदि आप ऑब्जेक्ट के साथ संग्रहित आईडी आईडी का उपयोग नहीं करते हैं, और इसका इरादा कभी नहीं चाहते हैं या इसका उपयोग नहीं करना चाहते हैं, तो इसकी स्पष्ट रूप से आवश्यकता नहीं है।
ग्रैंडमास्टरबी

@GrandmasterB अच्छी तरह से आप आईडी का उपयोग करते हैं, सवाल यह है कि क्या आप ऑब्जेक्ट के साथ मेमोरी में आईडी स्टोर करते हैं, और क्यों।
xenoterracide

जवाबों:


8

संक्षिप्त उत्तर: ऑब्जेक्ट के भीतर ऑब्जेक्ट आइडेंटिफ़ायर को शामिल करना आवश्यक है यदि यह संदर्भित होने वाला है।

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

इसके अलावा, आपके पास अपने डीटीओ की वस्तु के हल्के कंटेनर के रूप में हो सकता है, जो अपने आप में वस्तु पहचानकर्ता को छोड़ / शामिल कर सकता है। वास्तव में यह सभी विकल्प वास्तव में आपके व्यावसायिक उपयोग के मामलों और जरूरतों पर निर्भर हैं

संपादित करें: यदि आप अपनी वस्तु की पहचान करना चाहते हैं तो आपको एक पहचानकर्ता होना चाहिए। वह पहचानकर्ता एक सरोगेट आईडी, तिथि-समय, मार्गदर्शिका, आदि हो सकता है ... मूल रूप से, कुछ भी जो आपकी वस्तु की पहचान दूसरों से अनूठे तरीके से करता है।


2
उन्हें केवल संग्रह के बजाय (संग्रह को किसी प्रकार का शब्दकोश मानकर) वस्तु में शामिल क्यों किया जाना चाहिए?
xenoterracide

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

1
बेशक, मेरा सवाल यह है कि वस्तु को उस पहचानकर्ता के बारे में जानने की आवश्यकता क्यों है।
22

थोड़ा स्पष्ट करने के लिए मेरा मतलब है कि एक सरोगेट आईडी, आमतौर पर डेटाइम, या विन नंबर जैसी चीजें स्वाभाविक हैं और इस तरह डेटा का हिस्सा है, और नाम नहीं id(या कम से कम मैं नहीं)
xenoterracide

6

अपने प्रश्न के रूप में मेरे उत्तर को अमूर्त छोड़ने के प्रयास में, मुझे लगता है कि आपने वास्तव में अपने प्रश्न का उत्तर दिया है।

किसी ऑब्जेक्ट को अपनी स्वयं की आईडी पता होनी चाहिए यदि उसे इसकी आवश्यकता है।

एक वस्तु को अपनी आईडी (या यह भी पता है कि यह एक) नहीं पता होना चाहिए अगर यह करने की जरूरत नहीं है।

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


अपनी आईडी के बारे में जानकारी रखना कितना सुविधाजनक है? मैं इसे टटोल रहा हूं और सोच रहा हूं कि उनमें से ज्यादातर बस उसी तरह से आधारित हो सकते हैं जिस तरह से इसे कोडित किया गया था, शायद एक लूप के obj.idलिए संग्रह प्रस्तुत करने का विरोध करने के रूप में प्रस्तुत किया गया था।
xenoterracide

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

लेकिन यह एक कारण या एक प्रभाव है? क्या यह एक आवश्यकता है? यदि आपकी रिपॉजिटरी / कलेक्शन / डेटाटेपर (या कुछ चेन) अपडेट को जारी रखने के लिए जिम्मेदार है, और यह आईडी को जानता है और इसे पास करने में सक्षम है ... मैं यह समझने की कोशिश कर रहा हूं कि क्या इसके पीछे कोई कारण है या नहीं यह इसलिए है क्योंकि कई लोग रिकॉर्ड पैटर्न का उपयोग करते हैं और सक्रिय होते हैं।
xenoterracide 21

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

4

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

उदाहरण के लिए, यदि आप दो तरीकों से एपीआई बना रहे हैं:

फिर आपको दूसरे अनुरोध के JSON प्रतिक्रिया में ID 452 को फिर से भेजने की आवश्यकता नहीं है। एपीआई का उपयोगकर्ता आईडी पहले से ही जानता है।


4

मुझे लगता है कि यह व्यक्तिपरक है और आपके डिजाइन पर निर्भर करता है।

ज्यादातर हालांकि यह एक ऐसा डिजाइन प्रतीत होता है जो एक सक्रिय रिकॉर्ड से आता है । एक सक्रिय रिकॉर्ड में आपकी इकाई के पास डेटाबेस संचालन करने के तरीके हैं और इसलिए यह भी जानना चाहिए कि यह डेटाबेस पहचानकर्ता है।

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

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

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

सभी सामान्य आईडी इस प्रकार सिस्टम में सरोगेट कीज हैं, और मेमोरी रेफरेंस के साथ बदली जा सकती हैं, जिसमें केवल आईडी को देखना और रिकॉर्ड को आसान बनाना है।

चूँकि ida वैचारिक डेटा का एक टुकड़ा नहीं है, मुझे संदेह है कि यह (आम तौर पर) ऑब्जेक्ट के भीतर है, क्योंकि यह डोमेन से नहीं आता है। बल्कि इसे अपने उद्देश्य के लिए बनाए रखा जाना चाहिए जो एक ऐसी वस्तु की पहचान करना है जिसके पास अद्वितीय पहचान का प्रतिनिधित्व करने का कोई अन्य तरीका नहीं है। यह आसान के साथ एक संग्रह / संग्रह में किया जा सकता है।

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

अस्वीकरण : मैंने अभी तक एक ऐसी प्रणाली बनाने की कोशिश नहीं की है जिसमें इकाई के भीतर आईडी शामिल नहीं है और इस तरह खुद को गलत साबित कर सकता है।


2

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

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

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

आपके मामले में, यदि आप केवल db से डेटा प्राप्त कर रहे हैं और इसे webservice के माध्यम से आगे बढ़ा रहे हैं, तो आईडी को छोड़ना सही काम हो सकता है। मैं सिर्फ यह नहीं मानता कि इसे सामान्य मामले में रखने से ज्यादा समझ में आता है।


2

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

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

उस स्थिति में, आपके पास दो विकल्प हैं:

  • एक नया फ़ंक्शन तर्क 'आईडी' को रिपॉजिटरी संदर्भ और फ़ंक्शन के बीच फ़ंक्शन की पूरी श्रृंखला में प्रस्तुत करें जहां आईडी की आवश्यकता है

  • आईडी को ऑब्जेक्ट में शामिल करें

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

इसलिए मैं इसे तब करता हूं जब मैं इसे करता हूं।

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