2012-08-07 15 views
11

Mi chiedo quando è una cattiva idea utilizzare più istruzioni IF annidate.PHP - Istruzioni IF annidate

esempio:

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; 
       } 
      } 
     } 
    } 
}  

Questa funzione viene utilizzata in questo modo:

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

chiamo tutte le mie funzioni di questo tipo, e mi chiedo se c'è qualcosa di sbagliato con il mio stile di codifica. Sto avendo i miei dubbi perché se seguo questo disegno significa che ogni singola funzione che scrivo sarà semplicemente annidata con IF, controllando se ci sono errori in ogni fase. È questo che fanno gli altri?

Non vedo molti altri script scritti in questo modo, con l'IF annidato che forma un triangolo e ha solo il risultato desiderato nel mezzo. Se il centro non viene raggiunto, allora qualcosa si incasina.

Questa è una buona struttura di funzione?

+0

puoi semplicemente aggiungerli tutti in una sola istruzione, o lasciarlo come è chiaro per te stesso, è tutto per il gusto personale – Hawili

risposta

29

L'annidamento troppo profondo è generalmente una cattiva idea: è una logica spaghetti e difficile da seguire. Dal momento che ognuno dei tuoi passi di verifica dipende dallo stadio precedente essere riusciti, non fare il nido a tutti - basta tirare fuori dai guai quando una fase fallisce:

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


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

che lo rende esplicitamente chiaro quale sia la sequenza logica è.

2

Penso che sia sicuramente ben leggibile e può essere facilmente comprensibile rispetto all'utilizzo di un solo if dichiarazione come

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

Comunque io preferisco ancora fare in questo modo - troppo indention può ottenere un pò fastidioso :

1

Può essere utile annidarli, poiché modificando l'ordine è possibile evitare di effettuare confronti aggiuntivi. Quello che state facendo ora sembra buono, tuttavia la funzione sarebbe meno efficace se invece scritto come:

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; 
      } 
     } 

    } 
} 

Se $ new_password == $ confirm_new_password è vero, ma $ email è vuota, si avrà fatto un confronto extra.

Come altri hanno già detto, ci sono altri modi per procedere senza nidificare tutto, che sarà funzionalmente equivalente.