2012-09-14 15 views
5

System.Enum वर्ग के लिए MSDN प्रलेखन के सर्वश्रेष्ठ व्यवहार अनुभाग के अनुसार:एक गणित में पहले या आखिरी की तरह स्थिति मार्कर खराब अभ्यास क्यों मानते हैं?

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

यदि मैं सही ढंग से समझता हूं, तो हमें निम्नानुसार एक enum घोषित नहीं करना चाहिए।

public enum DrawOrder 
{ 
    VeryBottom = 0, 
    Bottom = 1, 
    Middle = 2, 
    Top = 3, 
    Lowest = VeryBottom, //marks a position in the enum 
    Highest = Top, //marks a position in the enum 
} 

यह बुरा अभ्यास क्यों माना जाता है?

+1

मुझे लगता है कि यह एक अभ्यास सी/सी ++ से किया जाता है। .NET दुनिया में, हमारे पास 'Enum.IsDefined',' Enum.GetValues', आदि है, इसलिए हैक अब और अधिक समझ में नहीं आता है। –

उत्तर

2

क्योंकि वे मान समय के साथ बदल सकते हैं। मान लीजिए कि आप एक प्रॉपर्टी सेट करते हैं (अपने उदाहरण का उपयोग करके) DrawOrder.Highest और इसे अपने डेटाबेस/दस्तावेज़/अन्य डेटा-सिंक में स्टोर करें।

समय बीतता है।

कोड परिवर्तन।

आपका DrawOrder enum ने कुछ और मूल्य प्राप्त किए हैं और आपके बने डेटा में मान अब DrawOrder.Highest के बराबर नहीं है। यह केवल DrawOrder.Highest के बराबर है जब डेटा जारी रखा गया था।

क्या आपको लगता है कि इस स्थिति में समस्याएं पैदा करने की संभावना हो सकती है?

+0

मुझे यह स्पष्टीकरण सबसे अच्छा लगता है, भले ही सभी उत्तरों समान हैं। धन्यवाद! – Osiris

2

मुझे यकीन नहीं है कि मैं सहमत हूं कि यह बुरा अभ्यास है; निर्भर करता है।

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

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

उल्टा यह है कि आपके द्वारा लूप के लिए लिखने वाला कोड तेज़ और स्वयं-दस्तावेज़ है।

2

क्योंकि यदि आप गणना में VeryTop = 4 जोड़ते हैं, तो आपको Highest अपडेट करना याद रखना होगा।

यदि आप ऐसा करने में विफल रहते हैं, तो सभी नरक टूट जाते हैं। यह भूलना आश्चर्यजनक रूप से आसान है कि कुछ समय बाद (कुछ महीने) पारित हो गया है।

1

मैं कहूंगा कि यह केवल एक बुरा विचार है यदि आप Enum को बनाए रखते हैं और एक मौका बदल सकता है। यदि आप इसे जारी नहीं रख रहे हैं, या enum बदलने की कोई संभावना नहीं है, तो यह ज्यादातर मामलों में शायद ठीक है। लेकिन फिर मार्कर का पूरा बिंदु इसलिए है क्योंकि मान बदल सकता है ... इसलिए यह वास्तव में कोई समझ नहीं लेता है।

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

मार्कर एनम का उपयोग तब किया जाना चाहिए जब आप अपने मूल्य के बावजूद उच्चतम या निम्नतम का उपयोग करना चाहते हैं।

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

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