2013-07-21 2 views
8

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

कभी-कभी मैं एक ऐसी विधि तैयार करूंगा जो उपयोगकर्ता को वेबसाइट पर लॉग इन करने जैसा कुछ करे। अक्सर बार मैं विधि से एक बूलियन लौटाता हूं, लेकिन यह अक्सर समस्याओं का कारण बनता है क्योंकि एक बूलियन रिटर्न वैल्यू किसी भी संदर्भ को व्यक्त नहीं करता है। यदि उपयोगकर्ता को लॉग इन करते समय कोई त्रुटि उत्पन्न होती है तो मुझे यह जानने का कोई तरीका नहीं है कि त्रुटि का कारण क्या है।

यहाँ एक विधि है कि मैं इस समय का उपयोग का एक उदाहरण है, लेकिन इतना बदलने के लिए कि यह सिर्फ 0 या 1.

public bool LoginToTwitter(String username, String password) 
{ 
    // Some code to log the user in 
} 

उपरोक्त विधि की तुलना में अधिक रिटर्न केवल सही है या गलत लौट सकते हैं करना चाहते हैं। यह अच्छी तरह से काम करता है क्योंकि मैं सिर्फ निम्नलिखित कॉल कर सकते हैं:।

if(http.LoginToTwitter(username, password)) 
{ 
    // Logged in 
} else { 
    // Not Logged in 
} 

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

मेरे पास कौन से वैकल्पिक दृष्टिकोण हैं?

उत्तर

8

आप अपेक्षित लॉगिन रीसेट के साथ enum बना और वापस कर सकते हैं।

public enum LoginResult 
{ 
    Success, 
    AccountSuspended, 
    WrongUsername, 
    WrongPassword, 
} 

फिर अपने विधि में enum प्रकार का उपयोग कर लौट:

public LoginResult LoginToTwitter(String username, String password) 
{ 
    // Some code to log the user in 
} 
+0

नई त्रुटि स्थिति कब हुई तो क्या खुशी हुई। @ डैन? – xhamr

+0

@jvra यदि कोई अप्रत्याशित अपवाद हैं, तो मेरा मानना ​​है कि उन्हें फिर से फेंक दिया जाना चाहिए क्योंकि कुछ अन्य उत्तरों संकेत देते हैं। हालांकि, आपका कोड सभी अपेक्षित मामलों को संभालने में सक्षम होना चाहिए: गलत उपयोगकर्ता नाम, गलत पासवर्ड, खाता निलंबन, आदि ... और उन अनुप्रयोगों को अपने आवेदन के लिए एनम में वापस करने के लिए वापस कर दें। –

+0

लेकिन तथ्य यह है कि, जब आप अन्य त्रुटि enum को संभालना चाहते हैं। आपका कोड बढ़ने के रूप में आपका कोड बढ़ सकता है। लेकिन अगर आप जानते हैं कि भविष्य में आप अधिक स्थिरांक enum नहीं हो सकता है तो एक स्वीकार्य है। – xhamr

8

आप चुन सकते हैं या तो एक प्रासंगिक संदेश संलग्न के साथ एक अपवाद फेंक (और अपवाद के साथ बुला विधि मशक्कत करनी पड़ती है), या फ़ंक्शन को विभिन्न राज्यों (जैसे LoginState.Success, LoginState.IncorrectPassword इत्यादि) के साथ enum लौटाएं।

आप अपवाद उपयोग कर रहे हैं, यह शायद अपने समारोह वापसी कुछ भी नहीं (public void LoginToTwitter) के लिए सबसे अच्छा है, लेकिन अगर आप एक enum उपयोग कर रहे हैं, सुनिश्चित करें कि सेट का नाम करने के लिए वापसी प्रकार बनाने के अपने enum (public LoginState LoginToTwitter)।

6

दो मानक तरीके हैं। यदि आप केवल परिणाम में रुचि रखते हैं, लेकिन कोई मेटाडेटा नहीं है, तो इसके बजाय कुछ enum वापस करें। उपलब्ध मानों को Success, Suspended, आदि पर सेट करें (आपके सभी संभावित परिणाम)

यदि आपको कुछ और विवरण चाहिए, तो आप हमेशा अपवादों का उपयोग कर सकते हैं। मूल रूप से "बताएं, मत पूछें" विचार का पालन करें और अपने फ़ंक्शन को इस तरह से लिखें कि यह आवश्यक मूल्यों को लौटाता है (उदाहरण के लिए उपयोगकर्ता आईडी? या शायद कुछ भी वैश्विक लॉगिन स्थिति नहीं है) केवल सफलता पर और विस्तृत के साथ अपवाद फेंकता है अन्यथा विफलता का विवरण। पदानुक्रम के बारे में, आपको अधिक से अधिक विशिष्ट उप-वर्गों के साथ LoginException लागू करने और केवल उनको पकड़ने की संभावना है। (यह सभी प्रासंगिक अपवादों को सत्यापित करने में आसान बनाता है और सभी अज्ञात लोगों को उच्च स्तर पर पारित किया जाता है)

0

स्वच्छ कोड प्रवृत्ति के अनुसार आपको अपनी विधि के लिए एक सार्थक नाम प्रदान करना चाहिए जो इरादा प्रकट करता है।

यह जानने के लिए कि क्या हुआ अगर लॉगिंग ऑपरेशन पूरा नहीं हो सका तो आप अपने प्रवाह Exceptions में परिचय कर सकते हैं और इसे कॉलर संदर्भ में संभाल सकते हैं।

, http://msdn.microsoft.com/en-us/library/ms173160(v=vs.80).aspx

3

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

मुझे लगता है कि सैसे का एक समान विचार था, लेकिन उसने अपना जवाब हटा दिया और कभी भी इसे समझाया नहीं।

+0

तो मूल रूप से, 'शून्य' का मतलब * सफलता * होगा - जो कि प्रतिद्वंद्वी लगता है। और निश्चित रूप से यदि आपको वास्तव में वापसी की आवश्यकता है, जैसे कि उपयोगकर्ता की जानकारी ... कहें तो मैं स्मॉलटाक जैसी भाषा में इसके लिए एक अच्छा मामला देख सकता हूं, जिसे गतिशील रूप से टाइप किया गया है, लेकिन एक स्थिर रूप से टाइप की गई भाषा जैसे सी # यह बोझिल बनाता है । – cHao

+0

@cHao: यदि आगे प्रसंस्करण के लिए कुछ अन्य जानकारी लौटा दी जाती है, तो अपवाद फेंकना और अधिक समझ में आता है। लेकिन अगर लॉगिन विफलता एक अपेक्षित परिणाम है ... अच्छी तरह से मैं गैर असाधारण स्थितियों के लिए 'फेंक' का उपयोग नहीं करता हूं। –

+0

मैं अर्द्ध हैरान हूं कि किसी को 'LoginResult' प्रकार नहीं माना जाता है जो अपवाद नहीं है, बल्कि यह एक enum भी नहीं है। यह गैर-असाधारण स्थितियों के लिए अपवाद फेंकने की ओर आकर्षित करने के बिना लोगों को बिना किसी जानकारी के मनमाने ढंग से जानकारी लौटने की लचीलापन प्रदान करेगा। – cHao

0

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

if ((status = DoSomething()) == AnErrorEnum.NotAnError) 
{//success handler 
} 
else 
{//failure handler 
} 

मैं एक MSDN लेख का लिंक देने के लिए कहा गया था - यहाँ कल्पना के एक पुराने संस्करण है:। http://msdn.microsoft.com/en-us/library/aa691315(v=vs.71).aspx

"एक सरल काम अभिव्यक्ति का परिणाम बाईं संकार्य करने के लिए सौंपा मूल्य है परिणाम बाईं संकार्य के रूप में एक ही प्रकार है और हमेशा एक मूल्य के रूप में वर्गीकृत है। "

+0

यह दिलचस्प है। कृपया एमएसडीएन दस्तावेज़ों के लिए कोई लिंक कृपया? –

+0

यह spec में है, जो डाउनलोड के लिए उपलब्ध है: यहां 2003 से पुराने spec का अनुभाग है: http://msdn.microsoft.com/en-us/library/aa691315(v=vs.71).aspx –

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