हमें गतिशील रूप से टाइप की गई भाषाओं में एनम की आवश्यकता क्यों है?


32

मैं यहां कुछ कोड पढ़ रहा था और देखा कि html टैग के नामों को संग्रहीत करने के लिए एक एनम का उपयोग किया जाता है। हमें कभी ऐसा करने की आवश्यकता क्यों है? इस रणनीति का उपयोग करने से मुझे क्या लाभ होगा?

मुझे पता है कि संकलित या वैधानिक रूप से टाइप की गई भाषाओं में कितनी उपयोगी एनम हैं, लेकिन जब मैं गतिशील रूप से टाइप की गई भाषाओं में एनम देखता हूं तो मुझे उत्सुकता होती है, जैसे मैंने ऊपर दिखाए गए उदाहरण कोड। तो, यह प्रश्न मूल रूप से उबलता है कि हमें गतिशील रूप से टाइप की गई भाषा में एनम की आवश्यकता क्यों है या क्या हमें उनकी आवश्यकता है?


38
यह प्रश्न मूल रूप से "हमें प्रकारों की आवश्यकता क्यों है"
user11153

1
क्या आपने रेपो को यह देखने के लिए खोजा कि इसे कैसे कहा जाता है? इससे आपको प्राप्त उत्तरों की बेहतर समझ मिलेगी।
RubberDuck

यदि आपके पास: enum People { YOU, NPC, FOO, BAR }और एक फ़ंक्शन जो एक (लोग) चाहता है int, तो आप एक नंबर का उपयोग करने के बजाय, जो भी प्लग कर सकते हैं।
इवान कार्सलेक

3
क्या आप इस विशेष "enum" के उद्देश्य के बारे में पूछ रहे हैं या सामान्य रूप से किसी भी भाषा में enums के उद्देश्य के बारे में पूछ रहे हैं? मैं पूर्व मान लेता हूं, लेकिन सभी वर्तमान उत्तर उत्तरार्द्ध के बारे में सोचते हैं ...
मेरिटॉन -

जवाबों:


56

एक लाभ यह है कि संकलक आपको यह बता सकता है कि क्या आप गलती से "ADRESS" या "FEILDSET" टाइप करते हैं, और रनटाइम पर निरर्थक व्यवहार करने के बजाय आपको इसे तुरंत ठीक करने देते हैं।

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


4
@amon: आप कर सकते हैं, लेकिन यह सुनिश्चित करने के लिए कि आपके पास टक्कर नहीं है, एनम आपको एक आसान तंत्र देता है।
whatsisname

75
एक जगह मैं एक महीने के लिए काम करता था, एक महीने में बग का पीछा करने के लिए किसी के उज्ज्वल विचार के कारण एनम के बजाय स्ट्रिंग स्थिरांक, खराब संपादक फोंट का उपयोग करने के लिए, और गलती से नाम दिया गया क्षेत्र"PROF1LE_"
गॉर्ट द रोबोट

8
@amon Go बिल्कुल यही करता है। हालांकि, एनम के बारे में एक अच्छी बात यह है कि कंपाइलर यह जांच सकता है कि आपके स्विच स्टेटमेंट में हर संभव एनम वैल्यू के लिए एक केस है।
weberc2

15
यह कोड 80 के दशक में लिखा गया था। आपको इसका एहसास नहीं हो सकता है, लेकिन यह एक ऐसे युग में था जब कुछ डेवलपर्स ने शारीरिक टाइपराइटर विकसित करना सीखा था, जिसमें एक भी कुंजी नहीं थी । हालांकि वास्तव में मुझे एहसास है कि प्रश्न में स्ट्रिंग "Profi1e" था ... यह पच्चीस साल हो गया है, इसलिए मेरी स्मृति स्पष्ट रूप से सही नहीं है।
रोबोट

4
@DarrelHoffman: मुझे आश्चर्य है कि आप आश्चर्यचकित हैं। पर्ल में, मैं अक्सर अपने आप को टाइप करता हूं $1जब मेरा मतलब होता है $i। (दी, मैं f1leइसके बजाय कभी टाइप नहीं करता file- $1गलती इस तथ्य से भड़की हुई है जो $1पर्ल में बहुत आम है - लेकिन फिर भी, सभी प्रकार की गलतियां आम हैं। हो सकता है कि देव के पास prof1leइसके साथ एक पासवर्ड था , जिससे उन्हें गलती से भड़काना पड़े। profileगैर पासवर्ड संदर्भों में)।
ruakh

22

Enums उन स्थितियों के लिए उपयोगी हैं, जहां आपके पास निश्चित मूल्य / संस्थाएं हैं जो समझदार हैं। वे स्व-दस्तावेजीकरण कर रहे हैं और संकलक को उन चीजों को मान्य करने की अनुमति देते हैं जिन्हें अन्यथा रन-टाइम पर छोड़ दिया जाएगा। यदि सार्थक मूल्यों का सेट ज्ञात नहीं है या सख्ती से सीमित नहीं है, तो उनका उपयोग कभी नहीं किया जाना चाहिए।

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


1
"स्व-दस्तावेज" सबसे महत्वपूर्ण हिस्सा है। मैं बहुत अधिक जाँच करना चाहता था यदि ऐसा status === GEOLOCATION_ACQUIREDहो status === 3, तो जो व्यक्ति उस सॉफ़्टवेयर को बनाए रखता है वह समझता है कि क्या चल रहा है। जैसा कि आपने कहा, यह अमान्य मूल्यों को भी रोकता है।
निकोलस बौलियान

11

Enums का OOP से कोई लेना-देना नहीं है, और JavaScript में Enums नहीं हैं। इसके बजाय, जब भी निश्चित मानों के बीच कोई विकल्प होता है, तो एनम का उपयोग किया जाता है। उदाहरण के लिए, एक बूलियन सही और गलत के बीच एक विकल्प है, जिसे इस रूप में लागू किया जा सकता है enum Bool { False, True }। GUI लाइब्रेरी में, हम संरेखण के लिए एक enum हो सकते हैं enum HAlignment { LEFT = -1, CENTER = 0, RIGHT = 1 }:।

यह आमतौर पर अप्रासंगिक है कि एनम कैसे लागू किया जाता है, महत्वपूर्ण हिस्सा यह है कि प्रत्येक संभव मूल्य अलग है। कई भाषाएं एनम के लिए पूर्णांक का उपयोग करती हैं, हालांकि कुछ जावा मध्यस्थ वस्तुओं का समर्थन करते हैं।

अब तक, हम केवल स्थिरांक का उपयोग कर सकते थे, उदा const int LEFT = -1, CENTER = 0, RIGHT = 1। हालांकि, एक संकलक जानता है कि एनम मान एक साथ हैं। इसलिए जब मैं एनम मूल्यों पर स्विच करता हूं switch(value) {case LEFT: ...; case RIGHT: ...;}, तो कंपाइलर मुझे चेतावनी दे सकता है कि मैं CENTERमामले को भूल गया हूं । यह पर्याप्त समय बचाने वाला हो सकता है। एनमोंस के बिना या स्विच-केस निर्माण के बिना भाषाओं में, यह विज़िटर पैटर्न के साथ अनुकरण किया जा सकता है, हालांकि यह स्थिर टाइपिंग की उपस्थिति में अधिक सहायक है।

दूसरा फायदा यह है कि एनम को एक अलग प्रकार के रूप में माना जा सकता है। उदाहरण के लिए, मैं यह घोषित कर सकता हूं कि कोई विधि HAlignmentकिसी भी पूर्णांक के बजाय एक पैरामीटर लेती है । यदि मैं कुछ भी प्रदान करता हूं, लेकिन कोड तीन संभावित हैलिगमेंट मानों में से एक को संकलित करने में विफल हो जाएगा। हालाँकि, C की एनम अच्छी तरह से एनकैप्सुलेटेड नहीं हैं और एनम कॉन्स्टेंट को पूर्णांकों के साथ परस्पर उपयोग किया जा सकता है। अन्य भाषाएँ यहाँ स्पष्ट हैं।

जावास्क्रिप्ट में, हमें इनमें से कोई भी लाभ नहीं मिलता है। दिए गए उदाहरण में एक ऑब्जेक्ट घोषित किया जाता है जिसे एक एनम के रूप में माना जाता है। यह प्रोग्रामर के लिए कुछ फायदे हैं, उदाहरण के लिए, यह प्रलेखन को आसान बनाता है, सभी "स्थिरांक" को एक ही ऑब्जेक्ट में…। हालाँकि, यह सिर्फ एक कन्वेंशन है कि इस तरह का ऑब्जेक्ट एनम-लाइक है।

यहां मुद्दा यह है कि HTML में केवल टैग का एक सीमित और ज्ञात सेट है। आप एचटीएमएल 5 विनिर्देश को देख सकते हैं और उन तत्वों के नाम को अपने कोड में एक एनम के रूप में डाल सकते हैं, और इसलिए <blink>आपके प्रोग्राम में एक टैग को चुपके करना अधिक कठिन बना देता है । इस ज्ञान को एक जगह पर एन्कोड करने से बेहतर है कि अपने कोड को विशेष स्ट्रिंग शाब्दिक (या बदतर, जादुई संख्या) के साथ लिटाना।


उस स्थिति में अगर मैं <blink>जावास्क्रिप्ट में किसी विधि से गुजरता हूं तो कुछ भी मुझे रोक नहीं सकता है? लेकिन javaहैलो में ढीला टूट जाता है :)
कोडयोगी

@ कोडियोगी हाँ, क्योंकि जेएस में एक स्थिर प्रकार की प्रणाली नहीं है, और विशेष रूप से एनम प्रकार की कोई अवधारणा नहीं है। हालाँकि, मैं एक विधि पैरामीटर को "एक टैगनाम लेता हूं" के रूप में दस्तावेज कर सकता हूं, जो एक प्रोग्रामर को इसे लागू करने के लिए प्रेरित करेगा foo(TagName.STRONG)जो थोड़ा बेहतर है। यह बेहतर होगा कि यदि क्षेत्र मौजूद नहीं है तो जेएस शिकायत करेगा, लेकिन यहां हम केवल एक undefinedकोशिश करते हैं TagName.BLINK। यह जेएस में बहुत लायक नहीं है, लेकिन यह एक शुरुआत है।
आमोन

हम्म, ऊपर बताए गए कोड लिंक क्लोजर कंपाइलर का उपयोग करता है इसलिए वहां समझदारी है।
कोड्योगी

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

@JimmyJames मैं JS के बारे में बात कर रहा हूं, Clo j ure के बारे में नहीं (जो कि Java प्लेटफॉर्म पर चल रहा है, OOP को कुछ हद तक सपोर्ट करता है)। प्रश्न को ऊप के साथ टैग किया गया था , यही वजह है कि मैंने शुरुआत में इसका उल्लेख किया। मैं वास्तव में नहीं दिख रहा है कि कैसे typesafe enums OOP से जुड़े हैं, यह है कि सिर्फ एक प्रकार प्रणाली सुविधा (कई गैर OOP भाषाओं प्रकार सिस्टम :-) है)
आमोन

3

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

यदि आप उदाहरण के लिए जावास्क्रिप्ट में ऑब्जेक्ट शाब्दिक जैसे एनम का उपयोग करते हैं, तो आपका संपादक आपको कोड पूरा करने देगा और JSHint या JSLint जैसा आपका कोड चेकर आपको चेतावनी देगा, यदि आप गलती से गलत मान का उपयोग करते हैं।


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

2

इस तरह की एनम का मुद्दा जेएस आपी (गुग) को अनुमत टैग का एक सेट / बंडल प्रदान करना हो सकता है। कौन सा? W3C HTML 4.01 द्वारा परिभाषित किए गए हैं ( एनम के दस्तावेज देखें) )। तो यह सेटिंग्स सीमा है।

यह वास्तविक लक्ष्य हो सकता है या नहीं भी हो सकता है, हालांकि यह इस तरह के उद्देश्य के लिए ठीक काम करेगा।

यदि आप जानते हैं कि जावास्क्रिप्ट कैसे काम करता है, तो कोड क्या कर रहा है स्ट्रिंग स्ट्रिंग द्वारा अनुक्रमित सरणी को परिभाषित कर रहा है :-)। कौन सा मूल्य एक स्ट्रिंग है, लेकिन यह विशेषताओं, कार्यों, आदि के साथ कोई अन्य घटक हो सकता है ... अपनी कल्पना को मुक्त होने दें और आप हर जगह लाभ देखेंगे।

एक तरफ जावास्क्रिप्ट, मैं मॉडलिंग और राज्य मशीनों के प्रबंधन के लिए एनम का उपयोग करता हूं ।

START> IN_PROGRESS> पुष्टि> समाप्त> ...

जावा स्विच में एनमों की अनुमति देता है ताकि राज्यों को राज्य मशीन में मान्य करना काफी आसान हो , पूरे एनम को लूप करने के लिए, जटिल एनमों को करके प्राथमिकताओं को परिभाषित करने के लिए, ...

मैं उन्हें टाइप्ड और अनमॉडिफ़ेबल स्थिरांक को परिभाषित करने के लिए भी उपयोग करता हूं:

  • हाॅं नही

इसके अलावा जटिल एनम (जो सुरक्षित ट्रांसफॉर्म / पार्सर करने की अनुमति देता है)

  • हां (1, सत्य), नहीं (0, गलत)

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

एनम जो देता है (अन्य बातों के अलावा) सीमाएं और टाइपिंग है

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