2012-12-17 14 views
6

इस चर्चा डिफ़ॉल्ट मान के नाम के बारे में है: C#: Should the default value of an enum be None or Unknown?सी ++ डिफ़ॉल्ट enum मूल्य उपयोग

हालांकि, मैं हाल ही में माना डिफ़ॉल्ट enum मूल्यों हानिकारक, अनावश्यक और संभवतः एक बुरा व्यवहार करने के लिए अग्रणी के साथ बात की लोगों की बड़ी राशि।

एक उदाहरण पर विचार के रूप में निम्नलिखित:

enum eJobStates 
{ 
    JOB_STATE_INITIALISING, 
    JOB_STATE_PROCESSING, 
    JOB_STATE_DONE 
}; 

यह एक नौकरी के लिए कोई मतलब नहीं होगा कहते हैं, में JOB_STATE_UNKNOWN होने के लिए, लेकिन आप कल्पना कर सकते हैं किसी भी संरचना है कि की निगरानी के लिए इस्तेमाल किया जा सकता ने कहा कि नौकरियों सकता है इस तरह के मूल्य का उपयोग करें।

क्या कोई enum परिभाषित करते समय डिफ़ॉल्ट मान बनाने से संबंधित अंगूठे का कोई सर्वोत्तम अभ्यास/नियम हैं? जब भी संभव हो तो उन्हें हर कीमत पर टालना चाहिए?

+0

क्या आपके पास मॉनीटरिंग मूल्य जोड़कर आपकी निगरानी कक्षा 'एन्हांस' बढ़ा सकती है? – dchhetri

+0

मैं सुझाव को पूरी तरह से समझ नहीं सकता। इस विशेष उदाहरण में MONITORING_STATE अभी भी नौकरी परिप्रेक्ष्य से अधिक समझ नहीं लेगा और, [लिंक] के अनुसार (http://stackoverflow.com/questions/1804840/extending-enums-in-c) मैं enum में विस्तार नहीं कर सकता निगरानी वर्ग (जो आदर्श रूप से एक निजी चर के रूप में eJobStates का उपयोग करता है)। – ellimilial

+1

हां मुझे एहसास है कि आप स्वाभाविक रूप से enums का विस्तार नहीं कर सकते हैं। monitor_state सिर्फ एक नाम था, लेकिन आप निश्चित रूप से job_state_unknown का उपयोग कर सकते हैं। मैं सुझाव था कि निगरानी कक्षा में अतिरिक्त enum जोड़ने के लिए था। आप eJobStates के अंतिम enum मान को लेकर और इसमें 1 जोड़कर ऐसा कर सकते हैं, और इसे मॉनिटरिंग क्लास के लिए शुरुआत enum State value बना सकते हैं। आखिरकार, enums के साथ आप बस इनट्स की तुलना कर रहे हैं जो राज्यों का प्रतिनिधित्व करते हैं। यदि आप कुछ और ठोस बनाना चाहते हैं, तो लिंक में सुझाए गए अनुसार आप या तो एनम क्लास बना सकते हैं, या प्रत्येक राज्य के लिए एक राज्य वस्तु बना सकते हैं। – dchhetri

उत्तर

2

एक अवैध डिफ़ॉल्ट मान मूल रूप से आपके डिजाइन में एक संस्करण है। जब यह बनाया गया है तो ऑब्जेक्ट मान्य नहीं है। आपको इससे बचना चाहिए कि जब यह उचित है। किसी भी तरह से आप इसे "हर कीमत पर" से बचना चाहिए।

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

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

namespace FooType { 
    enum EnumValue { 
    INVALID = 0 
    ,valid 
    }; 
} 

struct Foo { 
    Foo() : val(FooType::INVALID) {} 
    FooType::EnumValue get() const { 
    if (val == FooType::INVALID) 
     throw std::logic_error("variant Foo state"); 
    return val; 
    } 
    FooType::EnumValue val; 
}; 

यह आपके उपयोगकर्ताओं को आपके भिन्नता के कारण होने से मुक्त करता है, जो कि लड़ने के लायक है।

यदि आप इससे दूर नहीं जा सकते हैं, तो मैं आमतौर पर सुरक्षित और असुरक्षित इंटरफेस में गिरावट करना पसंद करता हूं।

struct Foo { 
    Foo() : val(FooType::INVALID) {} 
    bool get(FooType::EnumValue& val_) const { 
    if (val == FooType::INVALID) 
     return false; 
    val_ = val; 
    return true; 
    } 
    FooType::EnumValue get() const { 
    FooType::EnumValue val_; 
    if (!get(val_)) 
     throw std::logic_error("variant Foo state"); 
    return val_; 
    } 
    FooType::EnumValue get_or_default(FooType::EnumValue def) const { 
    FooType::EnumValue val_; 
    if (!get(val_)) 
     return def; 
    return val_; 
    } 
    FooType::EnumValue val; 
}; 

इस प्रकार के इंटरफेस डेटाबेस जैसी चीजों के लिए अच्छे हैं, जहां शून्य मानों की अपेक्षा की जा सकती है।

+0

"इस बारे में सोचें कि आपके और उस व्यक्ति के बीच संचार के मामले में जो कोड को बाद में बनाए रखना होगा" इसके लिए +1, बाकी सभी के शीर्ष पर! – xtofl

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