2009-11-26 10 views
7

Ho scoperto che ci sono molte istruzioni if-else, in particolare le istruzioni nidificate if else, queste istruzioni rendono il mio codice meno leggibile. Come ridurre il numero di istruzioni if ​​in PHP?Come ridurre il numero di istruzioni if-else in PHP?

I miei suggerimenti sono i seguenti: 1.Usare un'istruzione switch quando è adatta; 2. Usare exit() quando è fattibile; 3. Utilizzare la dichiarazione ternaria quando è fattibile;

Ci sono altri suggerimenti che possono ridurre se altre istruzioni, in particolare le istruzioni if-else nidificate?

risposta

17

Riforma il tuo codice in unità di lavoro più piccole. Troppa logica condizionale è un odore di codice e in genere indica che la funzione deve essere sottoposta a refactoring.

3

Utilizzare l'operatore ternario, rifattorizzare il codice, scrivere una funzione o una classe che esegue tutte le istruzioni if ​​if necessarie.

1

polimorfismo potrebbe sbarazzarsi di pochi così, allthough più difficile da implementare per ridurre if/else in PHP in quanto non è di tipo sicuro ...

19

Provare a usare "rientro anticipato", quando possibile, al fine di ridurre la profondità di annidamento. Prova ad usare la valutazione dell'espressione booleana.

Esempio:

function foo($param) 
{ 
    $ret = false; 

    if(userIsLoggedIn()) { 
     if(is_array($param)) { 
      if($param['count'] > 0) { 
       $ret = true; 
      } 
      else { 
       $ret = false; 
      } 
     }   
    } 

    return $ret; 
} 

Si potrebbe riscrivere questa come:

function foo($param) 
{ 
    if(!userIsLoggedIn()) return false; 
    if(!is_array($param)) return false; 
    return $param['count'] > 0; 
} 
+0

+1 Questo è molto importante in quanto può ridurre le dimensioni del file di diversi KB! – Xeoncross

+0

+1 Vale anche per continuare, rompere, lanciare.Spesso è possibile mantenere la complessità ciclica bassa in questo modo e rendere quindi il codice più leggibile. – NikiC

+5

Anche io personalmente userei solo 'return userIsLoggedIn() && is_array ($ param) && $ param ['count']> 0;' qui. È breve e conciso. – NikiC

9

esiste un metodo accademico ufficiale per il refactoring e semplificare un sacco di if condizioni, chiamato Karnaugh mappatura.

Comprende più condizioni di prova e tenta di semplificare la creazione di istruzioni if semplificate che coprono tutti i casi richiesti.

Puoi saperne di più su wiki here.

1

Io lavoro su un sacco di codice che è pieno di logica aziendale in continua evoluzione e deve essere modificato ogni giorno. Due suggerimenti che mi hanno sicuramente aiutato a tenere il passo con le modifiche sono: evitare tutte le altre istruzioni e tornare/uscire il prima possibile. Non entrare mai in nidificazione profonda -> creare sotto-routine/funzioni.

Sostituzione di tutti else con negata se le dichiarazioni rende il codice più facile da leggere verso il basso (la vicinanza del condtion e il blocco di codice):

# business logic block 
if ($condition) { 
    # do something 
    # code code code 
} else { 
    # code code code 
    return; 
} 

# refactored: 
if (! $contition) { 
    # code code code 
    return; 
} 
if ($condition) { 
    # code code code 
} 

In secondo luogo, il ritorno/uscita il più presto possibile . La mia opinione ovviamente, ma non vedo il punto di passare attraverso condizioni/test aggiuntivi quando una volta hai già determinato il risultato della subroutine, specialmente quando vorresti leggere il codice dall'alto in basso. Rimuovere tutte le ambiguità rende le cose più semplici.

Per concludere, mi piace evitare di utilizzare altro in particolare nelle lunghe liste di BL. Torna appena conosci il risultato. Se il livello di nidificazione è superiore a 2, creare sub-routine/funzioni.

+0

Questo potrebbe naturalmente essere nuovamente rifattorizzato come: –