2009-01-29 15 views
13

तो मैं कुछ कोड देख रहा था जिसमें चेक किया गया था और मुझे सभी परेशान हो गए:स्थिर चर को enums के साथ प्रतिस्थापित किया जाना चाहिए?

// Amount of days before cancellation can't be done 
enum Cancellation { Limit = 2 }; 

जिस व्यक्ति ने इसे चेक किया है उससे पूछते हुए उसने तर्क दिया कि स्थिर चर के बजाए enums का उपयोग करना बेहतर है, इससे बेहतर :

private static int CANCELLATION_LIMIT = 2; 

तो हमने बहस शुरू कर दी। मेरा तर्क था कि वह मूल्यों को स्टोर करने के तरीके के रूप में enum का उपयोग कर रहा था (यदि एक ही मूल्य के साथ दो enum प्रतीकों थे तो यह तोड़ देगा)। उन्होंने तर्क दिया कि यह एक वर्ग में स्थैतिक चर के लिए एक antipattern था।

मेरा प्रश्न यह है कि या तो सर्वोत्तम अभ्यास का उपयोग किया जाना चाहिए?

+0

"अगर वहाँ एक ही मूल्य के साथ दो enum प्रतीकों थे इसे तोड़ने देंगे" - नहीं, यह नहीं होगा - आप एक ही मूल्य के साथ एक ही परिभाषा में एक से अधिक enums हो सकता है। किसी भी तरह से, यह 'const' होना चाहिए। –

उत्तर

8

Enums लिखे जाते हैं (मैं तार्किक संगत के एक बड़े प्रशंसक हूँ)।

यह है कि, यदि आपके पास कोई तरीका है जहां आपको उदाहरण के लिए किसी विधि को 'निश्चित' पास करना है, तो आप केवल 'मान्य' तर्क ही पारित कर सकते हैं। उदाहरण के लिए:

enum OrderState 
{ 
    pending = 1, 
    shipped = 2 
} 

public IList<Order> GetOrdersInState(OrderState) 
{ 
} 

यह enums का उपयोग करने का -imho- एक अच्छा उदाहरण है। जब ऑर्डरस्टेट एक int है जिसके लिए आप 2 कॉन्स इन्ट्स बनाते हैं, तो आपके पास कोई प्रतिबंध नहीं है और वे अमान्य मानों को पार करने में सक्षम हैं। संकलक शिकायत नहीं करेगा।

हालांकि, जो मामला आप ला रहे हैं, मुझे लगता है कि enums का उपयोग एक वैध समाधान नहीं है। यह एक int का उपयोग करने का दुरुपयोग है, और एक कॉन्स int का उपयोग किया जाना चाहिए।

Enums अच्छे हैं, लेकिन इन्हें इस्तेमाल किया जाना चाहिए जहां उनका उपयोग किया जाना चाहिए। वे हर स्थिति में पसंदीदा उपकरण नहीं हैं। इस मामले में एक कॉन्स या स्थिर var होने के कारण एक एंटीपाटर नहीं है।

+0

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

+0

ध्यान दें कि यह संभव है गलत गणना मूल्य पारित करने के लिए: 'GetOrdersInState ((OrderState) 99);' में परिणाम होगा 99 का एक एनम वैल्यू पास हो रहा है। यदि आप पूछते हैं तो कंपाइलर और रनटाइम आपके लिए ऐसा करने में खुश है। –

0

मुझे लगता है कि यदि आपके पास सीधे जुड़े हुए मानों का एक सेट है तो आपको enums का उपयोग करना चाहिए।

कुछ ऐसा है: enum status {open = 1, बंद = 2, प्रतीक्षा = 3};

अन्य सभी के लिए, मैं कहूंगा कि स्थैतिक चर जाने का रास्ता है।

0

मुझे नहीं पता कि यह एक वर्ग (?) में स्थिर चर रखने के लिए एक विरोधी पैटर्न है। उदाहरण के लिए, नेट फ्रेमवर्क में रंग वर्ग में कई स्थिर सार्वजनिक चर हैं, जैसे Color.Red। तो, उस परिप्रेक्ष्य से, मैं आपसे सहमत होगा।

हालांकि, एक समझौता हो सकता है: निजी कॉन्स CANCELLATION_LIMIT = 2 का उपयोग करें; और आप दोनों को खुश होना चाहिए। उनके लिए, कक्षा (?) के लिए कोई वैश्विक चर नहीं होगा, क्योंकि कॉन्स को कंपाइलर द्वारा प्रतिस्थापित किया जाएगा, और आपको एक स्पष्ट नाम के साथ परिवर्तन का एक बिंदु मिलेगा।

12

वापसी "क्या यह तर्कसंगत रूप से मूल्यों का एक सेट है"? "Enum उचित है": "स्थैतिक स्थिरांक ठीक है"

+0

बिल्कुल सहमत हैं, 100%। सी # में –

+0

मुझे नहीं लगता कि आप स्थिर स्थिर हो सकते हैं। इसकी या तो कॉन्स, या स्थैतिक रीडोनली :) – Svish

+1

वास्तव में सभी कॉन्स अंतर्निहित स्थिर हैं, और स्पष्ट विनिर्देश प्रतिबंधित है (हालांकि मैं स्थिर रूप से एक स्थैतिक रूप से ठीक हूं) – annakata

2

नहीं, आप enum में स्थिर स्ट्रिंग चर या दशमलव मान कैसे परिभाषित करते हैं?

1

मुझे नहीं लगता कि CANELLATION_LIMIT एक enum की तरह लगता है, जो आमतौर पर विकल्पों का एक सेट है।

कुछ अलग के लिए, यदि यह था एक const, तो शायद ... लेकिन वर्तमान में यह एक अस्थायी क्षेत्र है?

ध्यान दें कि enums तक ही सीमित हैं पूर्णांक आधारित प्रकार, तो यह, आदि

+0

(यह एक downvote है ... मुझे पता है कि क्यों हमें खुशी होगी ...) –

1

अद्वितीय होने के लिए लक्षित अपरिवर्तनीय मूल्यों के लिए float, string के लिए इस्तेमाल नहीं किया जा सकता है, enumerations जाने का रास्ता है। पूछने का सवाल सरल है: क्या ऑब्जेक्ट को वैल्यू स्टोर करना चाहिए, यहां तक ​​कि स्थैतिक रूप से भी? कई मामलों में, जैसे त्रुटियों या कार्रवाई का वर्णन करते समय, जवाब नहीं है। याद रखें, enum रों लिए #define एक स्थानापन्न के रूप में पैदा हुआ था: यह पहचान का ठेठ मूल्यों जुड़े हुए हैं और यह एक प्रकार प्रदान करता है, यह वास्तव में नहीं कहना है "स्टोर इस निरंतर यहाँ"।

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

+0

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

+0

"स्थैतिक कॉन्स वैरिएबल" - क्या यह ऑक्सीमोरॉन नहीं है? –

+0

आप संदर्भ या पते से बहुत अच्छी तरह से एक कॉन्स पास कर सकते हैं। इसमें कुछ है: pass_me_an_object_by_addr (और my_const_object); –

संबंधित मुद्दे