2012-08-07 14 views
11

मैं सोच रहा हूं जब यह कई घोंसला वाले IF कथनों का उपयोग करने के लिए खराब विचार है।PHP - नेस्टेड IF कथन

जैसे:

function change_password($email, $password, $new_password, $confirm_new_password) 
{ 
    if($email && $password && $new_password && $confirm_new_password) 
    { 
     if($new_password == $confirm_new_password) 
     { 
      if(login($email, $password)) 
      { 
       if(set_password($email, $new_password)) 
       { 
        return TRUE; 
       } 
      } 
     } 
    } 
}  

यह समारोह इस तरह प्रयोग किया जाता है:

if(!change_password($email, $password, $new_password, $confirm_new_password) 
{ 
    echo 'The form was not filled in correctly!'; 
    exit; 
} 

मैं इस तरह मेरे सभी कार्यों कहते हैं, और वहाँ कुछ मेरी कोडिंग शैली के साथ गलत क्या है अगर मैं सोच रहा हूँ। मुझे संदेह है क्योंकि अगर मैं इस डिज़ाइन का पालन करता हूं तो इसका मतलब है कि मेरे द्वारा लिखे गए प्रत्येक फ़ंक्शन को केवल IF के साथ घोंसला मिलेगा, यह जांच कर लें कि प्रत्येक चरण में त्रुटियां हैं या नहीं। क्या यह अन्य लोग करते हैं?

मुझे इस तरह लिखी गई कई अन्य स्क्रिप्ट नहीं दिखाई देती हैं, घोंसला वाले आईएफ के त्रिकोण आकार के साथ और केवल वांछित परिणाम बहुत ही मध्य में होता है। यदि बीच नहीं पहुंचा है, तो कुछ खराब हो गया है।

क्या यह एक अच्छी कार्य संरचना है?

+0

आप बस उन सभी को एक कथन में जोड़ सकते हैं, या इसे छोड़ दें क्योंकि इसे स्वयं के लिए स्पष्ट करना है, यह सब व्यक्तिगत स्वाद के बारे में है – Hawili

उत्तर

29

बहुत गहराई से घोंसला करना आम तौर पर एक बुरा विचार है - यह स्पेगेटी तर्क और अनुसरण करना मुश्किल है। के बाद से अपने सत्यापन चरणों में से प्रत्येक पिछले चरण पर निर्भर करता है सफल रहा है, घोंसला बिल्कुल नहीं है - बस जमानत जब एक मंच में विफल रहता है:

function change_password(blah blah blah) { 
    if (!$condition1) { 
     return false; 
    } 
    if (!$condition2) { 
     return false; 
    } 
    etc.... 


    // got here, must have succeeded 
    return true; 
} 

कि यह स्पष्ट रूप से स्पष्ट करता है क्या तर्क अनुक्रम है।

2

मुझे लगता है कि यह निश्चित रूप से अच्छी तरह से पढ़ने योग्य है और आसानी से सिर्फ एक if बयान की तरह

if (blah and blah and blah and blah and blah and blah and blah) {} 

हालांकि मैं अभी भी चाहते हैं यह इस तरह से कर रही है पसंद करते हैं का उपयोग कर की तुलना में समझा जा सकता है - बहुत ज्यादा दांतेदार बनाना थोड़े परेशान प्राप्त कर सकते हैं :

function change_password($email, $password, $new_password, $confirm_new_password) 
{ 
    if (!$email || !$password || !$new_password || !$confirm_new_password) return false; 
    if ($new_password != $confirm_new_password) return false; 
    if (!login($email, $password)) return false; 
    if (!set_password($email, $new_password)) return false; 

    return true; 
} 
1

यह घोंसला करना अच्छा हो सकता है, क्योंकि ऑर्डर बदलकर आप अतिरिक्त तुलना करने से बच सकते हैं।

function change_password($email, $password, $new_password, $confirm_new_password) 
{ 
    if($new_password == $confirm_new_password && $email && $password && $new_password && $confirm_new_password) 
    { 
     if(login($email, $password)) 
     { 
      if(set_password($email, $new_password)) 
      { 
       return TRUE; 
      } 
     } 

    } 
} 

$ new_password == $ confirm_new_password सही है, लेकिन $ ईमेल रिक्त है, तो आप एक बना दिया है जाएगा: क्या आप अब कर रहे हैं अच्छा लग रहा है, फिर भी अपने कार्य करता है, तो आप के बजाय के रूप में यह लिखा था कम कुशल होगा अतिरिक्त तुलना

जैसा कि अन्य ने कहा है, इसके बारे में सब कुछ घोंसले किए बिना इसके बारे में जाने के अन्य तरीके हैं, जो कार्यात्मक रूप से समकक्ष होंगे।

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