क्या सिस्टम के जावा भाग के बाहर स्ट्रिंग्स या इंट का संदर्भ देना बेहतर है?


11

हम जावा में enums के उपयोग के बारे में मेरे काम पर चर्चा कर रहे थे।

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

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

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

क्या इस चर्चा के बारे में कोई सर्वोत्तम अभ्यास है जो मुझे मार्गदर्शन दे सके?

संपादित करें: जब भी यह संभव होता है, हम स्वयं एनम का उपयोग करते हैं, इसलिए हमारे सभी जावा कोड एनम का उपयोग करते हैं। "एनम के संदर्भ" से मेरा तात्पर्य है: जावास्क्रिप्ट से सर्वर में डेटा का आदान-प्रदान या डेटाबेस में डेटा को संग्रहीत करते समय एनम में मूल्य को संदर्भित करना।


1
आपके लिए "एक एनम का संदर्भ" क्या है? स्रोत कोड के भीतर सामान्य उपयोग? डेटा बेस में स्टोर करने के लिए सीरियललाइज़ेशन? अभिव्यक्ति उपयोगकर्ता दस्तावेज में उपयोग करने के लिए? तकनीकी प्रलेखन में उपयोग करने की अभिव्यक्ति? उन सभी के लिए उत्तर काफी अलग होगा।
किलन फ़ॉथ

मैंने प्रश्न संपादित किया है और मुझे उम्मीद है कि यह अब स्पष्ट है: "एक एनम के संदर्भ" से मेरा मतलब है कि जावास्क्रिप्ट से सर्वर या किसी अन्य तरीके से डेटा का आदान-प्रदान करने या डेटाबेस में मान को संचय करने के लिए मूल्य का संदर्भ
JSBach

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

जवाबों:


15

अच्छा प्रश्न। जावा में एनम का उपयोग मुख्य रूप से ऐसी जानकारी को संभालने के लिए है जो प्रकृति में कुछ हद तक स्पष्ट है। एक कार्ड हो सकता है चार प्रकार के सूट को संभालने के लिए एनम का उपयोग करते हुए क्लासिक उदाहरण। यह पूर्णांक का उपयोग करने के सभी प्रदर्शन लाभ प्रदान करता है और यह आपके कार्यक्रम में भी स्पष्ट है।

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

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

यदि इसके बजाय, आपके डेटाबेस ने "HEARTS", "DIAMONDS", "SPADES", "CLUBS" लिखा है, तो आपने अंतरिक्ष के संदर्भ में बहुत कम खो दिया है और बहुत कुछ हासिल किया है। यह सच है कि हम एक मामूली प्रदर्शन हिट के बारे में बात कर रहे हैं, लेकिन आपको वास्तव में उस डेटाबेस तक नहीं पहुंचना चाहिए जो अक्सर अंतर करता है। अंतरिक्ष के लिए के रूप में, सिस्टम प्रशासक को छोड़ दें (नहीं। आपकी समस्या।)।

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


2
अच्छा अंक है, लेकिन आप इस मामले में जहां किसी को (enum संस्थाओं में से एक का नाम बदलने का फैसला करता है के बारे में भूल रहे हैं HEARTSकरने के लिए Heartफिर से अपने उदाहरण में या कुछ और) और अचानक सब कुछ टूट जाता है।
स्कॉट व्हिटलॉक

1
@ScottWhitlock यदि आप उस के लिए खाते नहीं हैं, हालांकि वे इसे पूरी तरह से नाम बदलने का फैसला कर सकते हैं। वे गलती से डेटाबेस को नष्ट कर सकते हैं और परियोजना को भी हटा सकते हैं, लेकिन हम यहां हर संभव घटना के लिए जिम्मेदार नहीं हैं।
नील

5
@ नील - सच है, लेकिन हम यहाँ बाधाओं को खेलने की कोशिश कर रहे हैं। मैं जावा एनम से परिचित नहीं हूं, लेकिन सी # में, मैं स्पष्ट रूप से एनम के लिए मान निर्धारित करता हूं यदि प्रोग्राम के बाहर मानों की आवश्यकता होती है (जैसे डेटाबेस में) (जैसे हार्ट = 1, डायमंड्स = 2, आदि) । चूँकि एनम का उपयोग करने का डिफ़ॉल्ट तरीका नहीं है, इसलिए इसे बाद में संपादक को विराम देना चाहिए। इसके अलावा एक टिप्पणी जहां और इन का उपयोग किया जाता है वहाँ काम है।
स्कॉट व्हिटलॉक

1
@ScottWhitlock ऐसी समस्याओं से बचने के लिए निश्चित रूप से इसके बारे में बेहतर तरीका है। हालाँकि आपने ऐसा किया था, फिर भी आप डेटाबेस पर 1, 2, 3, 4 देखते हैं या किसी फ़ाइल में क्रमबद्ध होते हैं। रखरखाव के दृष्टिकोण से आदर्श नहीं है कि आप इसे कैसे भी काटें।
नील

2
अगर मैं जोड़ सकता हूं, अगर एनम को स्ट्रिंग के रूप में क्रमबद्ध किया गया है और किसी को एनम का नाम बदल दिया जाता है, तो deserialization के दौरान त्रुटि पार्सिंग के दौरान होगी। यदि एनम अंतरंग है और किसी ने परिभाषा बदल दी है, तो त्रुटि आगे की रेखा से नीचे होगी, प्रसंस्करण के दौरान, जिसका निदान करना कठिन होगा। सीसी @ScottWhitlock।
एंडी तजहोनो

1

मैं नील के जवाब से सहमत हूं, लेकिन सिर्फ एक अतिरिक्त:

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

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

और आपको उन मानों को मैन्युअल रूप से अद्वितीय रखना चाहिए (लेकिन यह सी शैली में समान है), और आप इसे जांचने के लिए परीक्षण लिख सकते हैं।


हां, हम इस रास्ते से नीचे चले गए, लेकिन हम हाइबरनेट का उपयोग कर रहे हैं और हमें डेटाबेस से / से मान को पार्स करने में सक्षम होने के लिए कुछ अतिरिक्त कोड जोड़ना पड़ा और यह एक तरह का अजीब लग रहा था, इसलिए हमने .STRING संबंध का उपयोग करने का निर्णय लिया। एनम नाम के साथ जाएं।
JSBach
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.