2010-06-10 13 views
7

इस के समान है:स्पष्टता के लिए समारोह से बूल के बजाय वापसी enum?

.NET: bool vs enum as a method parameter

लेकिन कुछ स्थितियों में एक समारोह से एक bool लौटने चिंताओं।

उदा। समारोह जो bool रिटर्न:

public bool Poll() 
    { 
     bool isFinished = false; 

     // do something, then determine if finished or not. 

     return isFinished; 
    } 

इस तरह उपयोग किया:

 while (!Poll()) 
     { 
      // do stuff during wait. 
     } 

इसके बुला संदर्भ क्या bool पोल से लौटे से स्पष्ट नहीं() का अर्थ है। कुछ तरीकों से यह स्पष्ट हो सकता है कि "पोल" फ़ंक्शन का नाम बदलकर "IsFinished()" रखा गया था, लेकिन विधि थोड़ा सा काम करती है, और (आईएमओ) वास्तव में यह नहीं दर्शाती कि वास्तव में कार्य क्या करता है। "Isfinished" जैसे नाम गुणों के लिए भी अधिक उपयुक्त लगते हैं। एक और विकल्प इसका नाम बदल सकता है जैसे: "PollAndReturnIsFinished" लेकिन यह सही नहीं लगता है।

तो एक विकल्प एक enum वापस करने के लिए हो सकता है। उदाहरण के लिए:

public enum Status 
    { 
     Running, 
     Finished 
    } 

    public Status Poll() 
    { 
     Status status = Status.Running; 

     // do something, then determine if finished or not. 

     return status; 
    } 

इस तरह कहा जाता है:

 while (Poll() == Status.Running) 
     { 
      // do stuff during wait. 
     } 

लेकिन यह overkill की तरह लगता है। कोई विचार?

+0

कोई बुरा सवाल नहीं है, लेकिन क्या आप कभी भी अपने अतिव्यापीकरण की तरह महसूस नहीं करते हैं? क्या आप अभी भी उत्पादक हैं यदि आप प्रत्येक छोटे से छोटे विवरण के बारे में सोच रहे हैं? – Konerak

+3

'सार्वजनिक enum Bool {True, False, FileNotFound}' के बारे में कैसे? – fmark

+0

@ कोनेरक - हाँ, आप सही हो सकते हैं। यह उन छोटी चीजों में से एक है जिसे मैं कभी-कभी चलाता हूं, और सोचता हूं कि क्या एक बेहतर, स्पष्ट तरीका था। –

उत्तर

3

एक विधि एक क्रिया की तरह पढ़ किया जाना चाहिए, और bool Poll() विधि का परिणाम भ्रामक है, और यह शायद यही कारण है कि इसका इस्तेमाल करने की अजीब लगता है।

// you wrote. 
while(!Poll()) 
{ 
    // still waiting .. do something. 
} 

जब मैं पहली बार अपने कोड को पढ़ने के लिए, मैंने सोचा कि यह कहा जबकि (सिस्टम है) नहीं मतदान, कुछ करते हैं?

लेकिन यह वास्तव में कहता है ... मतदान, और यदि मतदान समाप्त नहीं होता है तो हम प्रतीक्षा करते समय कुछ करते हैं।

आपका enum संस्करण कॉल के अर्थशास्त्र को बदलता प्रतीत होता है, लेकिन बेहतर के लिए, यही कारण है कि लोग इसे पसंद करते हैं। जबकि मतदान() अभी भी चल रहा है, हम प्रतीक्षा करते समय कुछ करें।

सबसे अधिक पढ़ने योग्य कोड जीतता है।

1

यदि आपके पास 2 से अधिक राज्य हैं, तो enum का उपयोग करें, अन्यथा बस bool का उपयोग करें।

संपादित करें:

अपने उदाहरण के रूप में, आप आसानी से दोनों के उपयोग, यदि आवश्यक हो तो कर सकते हैं।

public bool IsRunning { get {return Poll() == Running; }} 
public bool IsFinished { get {return Poll() == Finished; }} 
+0

आपको ऐसी संपत्ति में एक लंबा फ़ंक्शन नहीं चलाया जाना चाहिए। यदि आपको वास्तव में इसकी आवश्यकता है तो आपको पोल() के भीतर एक स्थानीय क्षेत्र निर्धारित करना चाहिए और संपत्ति में वापस जाना चाहिए। –

+0

@ जौके वैन डेर मास: मुझे कार्यान्वयन के विवरण के बारे में कोई जानकारी नहीं है, इसलिए मैं केवल जो कुछ दिया गया था उस पर जाता हूं। – leppie

+0

आप मान सकते हैं कि "पोल" विधि कॉल करने के लिए अपेक्षाकृत महंगा है (उदा। नेटवर्क पर कॉल करें)। क्षमा करें अगर मैं स्पष्ट नहीं था। –

2

सभी कोडों में से पहला कोड पढ़ने के लिए है, और आपके मामले में enum संस्करण बूल संस्करण से अधिक पठनीय है।

संपादित करें: आप आसानी से अन्य स्थितियां जोड़ सकते हैं अगर आप की जरूरत है

enum संस्करण के अन्य लाभ है। उदाहरण के लिए Error की तरह।

2

मैं .Net सम्मेलन का पालन करता हूं कि बूलियन गुणों को "है" के साथ उपसर्ग किया गया है और बूलियन विधियों को "कोशिश करें" (या "है" जहां उचित हो) के साथ उपसर्ग किया गया है।

आपके मामले में मुझे लगता है कि समस्या "पोल" नाम में है। यह बताते हुए विधि का नाम दें कि यह क्या कर रहा है या मतदान कर रहा है। जैसे TryDoSomething()

0

मैं जो कुछ करने की कोशिश कर रहा हूं उसे पढ़ और पुनः पढ़ता हूं। मेरे लिए, पोल() का मतलब यह होना चाहिए कि आप किसी चीज़ के लिए मतदान कर रहे हैं। फिर यदि स्थिति अभी भी चल रही है तो मैं स्थिति की जांच करूंगा।

मेरा परिणाम कोड इस तरह दिखेगा।

while (myObject.Poll() && myObject.IsRunning) 
{ 
    // myObject successfully poll it .. 
    // and is successful 
    // do more things here... 
} 

नोट: IsRunning एक गेटर/सेटर है। क्या यह स्पष्ट होगा?

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

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