जाँच करना कि क्या कोई विधि गलत है: परिणाम को अस्थायी चर में दें, या सशर्त में सीधे विधि मंगलाचरण डालें?


9

क्या एक विधि को कॉल करने के लिए एक अच्छा अभ्यास है जो एक सही कथन में सही या गलत मान देता है?

कुछ इस तरह:

private void VerifyAccount()
{
    if (!ValidateCredentials(txtUser.Text, txtPassword.Text))
    {
        MessageBox.Show("Invalid user name or password");
    }
}

private bool ValidateCredentials(string userName, string password)
{
    string existingPassword = GetUserPassword(userName);
    if (existingPassword == null)
        return false;

    var hasher = new Hasher { SaltSize = 16 };
    bool passwordsMatch = hasher.CompareStringToHash(password, existingPassword);

    return passwordsMatch;
}

या फिर उन्हें एक चर में स्टोर करना बेहतर है, यदि इस तरह के मूल्यों का उपयोग करके उनकी तुलना करें

bool validate = ValidateCredentials(txtUser.Text, txtPassword.Text);
if(validate == false){
    //Do something
}

मैं केवल .NET का संदर्भ नहीं दे रहा हूं, मैं सभी प्रोग्रामिंग भाषाओं में प्रश्न का जिक्र कर रहा हूं, ऐसा सिर्फ इसलिए होता है कि मैंने .NET का उपयोग एक उदाहरण के रूप में किया है


3
यदि आप एक अस्थायी चर का उपयोग करते हैं, if (!validate)तो इसके बजाय लिखें if (validate == false)
फिलिप

12
मैं की तरह समारोह कुछ ही नाम होगा "CredentialsAreValid ()" तो तुम्हें पता है कि यह एक bool लेकिन अन्यथा हाँ अपनी अच्छा अभ्यास लौट जाना चाहिए
जाकारी कश्मीर

3
IsValidCredentials, हालांकि व्याकरणिक रूप से अजीब है, एक बूलियन रिटर्न मूल्य को इंगित करने के लिए एक सामान्य प्रारूप है।
zzzzBov

@Philip क्या अंतर है अगर (? मान्य) और यह अगर (मान्य) ??
KyelJmD

!"नहीं" ऑपरेटर है, यह किसी भी बूलियन अभिव्यक्ति को नकारता है। तो if (!validate)के विपरीत है if (validate)। अगर validateसच नहीं है तो दर्ज किया जाएगा ।
फिलिप

जवाबों:


26

जैसा कि इन सभी चीजों पर निर्भर करता है।

यदि आप अपनी कॉल के परिणाम का उपयोग नहीं करने जा रहे हैं, ValidateCredentialsतो परिणाम को स्थानीय चर में संग्रहीत करने के लिए (डीबगिंग उद्देश्यों के अलावा) कोई आवश्यकता नहीं है। हालांकि, अगर यह कोड को अधिक पठनीय बनाता है (और इसलिए अधिक बनाए रखने योग्य) कि उसके साथ एक चर जाना है।

कोड औसत रूप से कम कुशल नहीं होने जा रहा है।


1
क्या वह प्रकार पठनीय है? जैसे मैंने ऊपर किया था
KyelJmD

@KyelJmD: यह उस संस्कृति पर निर्भर करता है जिसमें आप प्रोग्रामिंग कर रहे हैं। जिन जगहों पर मैंने प्रोग्राम किया है, !ValidateCredentialsवह अधिक पठनीय है क्योंकि यह स्पष्ट रूप से कहता है कि यह कोड में क्या कर रहा है। यह बहुत स्पष्ट है। यदि आप जिस फ़ंक्शन को कॉल कर रहे हैं, उसमें "स्व-दस्तावेज़ीकरण" नाम नहीं है, तो चर के साथ जाना बेहतर हो सकता है। जैसा कि यह खड़ा है, मैं चर को छोड़ने की सलाह देता हूं और आपके पास स्वयं-दस्तावेज कोड के साथ रहना चाहिए।
जोएल ईथरटन

ValidateCredentials पहली बार में पढ़ने योग्य नहीं है - नाम आपको कैसे बताता है कि परिणाम का क्या मतलब है? बहुत बेहतर या तो क्रेडेंशियलअवैद्य या क्रेडेंशियल्सअवरवैलिड।
gnasher729

9

एक अतिरिक्त चर का उपयोग क्यों करें? मैं पहले दृष्टिकोण का उपयोग करना पसंद करता हूं, यह अधिक पठनीय और सरल है।


4

क्या एक विधि को कॉल करने के लिए एक अच्छा अभ्यास है जो एक सही कथन में सही या गलत मान देता है?

हां, अगर सशर्त इनलाइन में सरल नहीं है और क्या यह पठनीय है।

या फिर उन्हें एक चर में स्टोर करना बेहतर है, यदि इस तरह के मूल्यों का उपयोग करके उनकी तुलना करें

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


2

देखते हैं...

क्योंकि यह सब के बारे में है KISS , वहाँ एक अतिरिक्त चर जब आप इसे बिना कर सकते हैं बनाने की आवश्यकता है। इसके अलावा, जब कोई जरूरत नहीं है, तो अधिक टाइप करने की आवश्यकता नहीं है।

लेकिन तब क्योंकि आप DRY , अगर आप बाद में कॉल कर रहे थे ValidateCredentialsऔर अपने आप को टाइप ValidateCredentials(txtUser.Text, txtPassword.Text)कर रहे थे, तो आपको पता है कि आपको एक अतिरिक्त वैरिएबल बनाना चाहिए था।


2

हां, आमतौर पर ऐसे तरीकों का उपयोग करना ठीक है जैसे कि स्थितियां। यह उपयोगी है हालांकि अगर विधि का नाम इंगित करता है कि विधि एक बूल लौटाती है; उदाहरण के लिए CanValidateCredentials। सी-शैली की भाषाओं में यह पद्धति अक्सर इज एंड कैन प्रीफिक्स का रूप लेती है, और रूबी में '?' के साथ। प्रत्यय।


1
विधि के नामों के बारे में अच्छी बात है, लेकिन मैं "if" के साथ विधि का नाम कभी नहीं शुरू करूंगा। फिर कोड "यदि" है तो पढ़ता है। "कैन" ठीक है if (cat.canOpenCanOfCatFood()):।
केविन क्लाइन

धन्यवाद, @ केविन। मेरा मतलब 'इफ' नहीं 'इफ' है। मैंने उत्तर संपादित किया
क्रिश्चियन हॉर्सडेल

1

एक और चिंता का विषय है जो अभी तक इंगित नहीं किया गया है: शॉर्ट-सर्किट मूल्यांकन । इन दो कोड अंशों में क्या अंतर है?

पूर्व # 1:

if(foo() && bar() && baz())
{
    quz();
}

पूर्व # 2:

bool isFoo = foo();
bool isBar = bar();
bool isBaz = baz();
if(isFoo && isBar && isBaz)
{
    quz();
}

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

उदाहरण # 2 में ऐसा नहीं है। फू (), बार (), और बाज () का हमेशा मूल्यांकन किया जाता है। यदि आप साइड इफेक्ट्स दिखाने के लिए बार () और बाज () की उम्मीद कर रहे हैं, तो आपको उदाहरण # 1 की समस्या होगी। उदाहरण # 1 ऊपर वास्तव में इस के बराबर है:

पूर्व # 3:

if(foo())
{
    if(bar())
    {
        if(baz())
        {
            quz();
        }
    }
}

# 1 और # 2 उदाहरणों के बीच चयन करते समय अपने कोड में इन अंतरों से अवगत रहें।


1

पठनीयता मुद्दे पर थोड़ा विस्तार ...

मैं परिणाम को चर में संग्रहीत करने के दो अच्छे कारणों के बारे में सोच सकता हूं:

  1. यदि आप एक से अधिक बार स्थिति का उपयोग करने जा रहे हैं, तो इसे एक चर में सहेजने का मतलब है कि आपको केवल एक बार फ़ंक्शन को कॉल करना होगा। (यह माना जाता है कि संग्रहीत मूल्य अभी भी मान्य है; यदि आपको इसे फिर से परीक्षण करने की आवश्यकता है, तो निश्चित रूप से यह लागू नहीं होता है।)

  2. यदि इसे एक चर में संग्रहित किया जाता है, तो स्थिति को एक नाम देकर पठनीयता में सुधार होता है जो आपको फ़ंक्शन कॉल में देखने से अधिक सार्थक है।

उदाहरण के लिए, यह:

bool foo_is_ok = is_ok(foo);
if (foo_is_ok) ...

पठनीयता में मदद नहीं करता है, लेकिन यह:

bool done_processing = feof(file1) && feof(file2);
if (done_processing) ...

शायद करता है, क्योंकि यह तुरंत स्पष्ट नहीं है कि feof(file1) && feof(file2)इसका मतलब है कि हम प्रसंस्करण कर रहे हैं।

passwordsMatchप्रश्न में चर शायद मेरा तुलना में एक बेहतर उदाहरण है।

एकल-उपयोग चर उपयोगी होते हैं यदि वे कुछ मूल्य को एक सार्थक नाम देते हैं। (यह निश्चित रूप से मानव पाठक के लाभ के लिए है।)


मुझे लगता है, मैं done_processingचर शुरू करने के बजाय एक टिप्पणी छोड़ दूंगा। आखिरकार, नाम done_processingएक टिप्पणी का कार्य करता है। और एक वास्तविक टिप्पणी मुझे इस बारे में एक या दो शब्द कहने की अनुमति देती है कि इस स्थिति के संकेत हम प्रसंस्करण के साथ क्यों कर रहे हैं। ऐसा नहीं है कि मैं एक महान टिप्पणीकार हूँ, हालांकि, मैं शायद वास्तविक कोड में न तो करूँगा ...
cmaster - reicaate monica

@cmaster: टिप्पणियों के साथ एक समस्या यह है कि वे कोड के साथ बहुत आसानी से सिंक से बाहर निकल सकते हैं। एक चर नाम done_processingइरादे को व्यक्त करने का अधिक टिकाऊ तरीका है।
कीथ थॉम्पसन

बिंदु संख्या 2 के लिए +1 - कभी-कभी एक अच्छी तरह से नामित अस्थायी संस्करण वास्तव में चीजों को स्पष्ट करता है।
5:
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.