2009-06-29 15 views
15

La mia domanda riguarda this previous question, ma le soluzioni offerte non risolvono il problema che ho descritto di seguito. Dopo una ricerca su google, non ho trovato linee guida sullo stile del codice che affrontino il problema specifico dei condizionali lunghi in un'istruzione if come questa.Come indentare condizionali lunghi per le istruzioni "if"?

if(isNull(value1) || 
    isToLong(value1) || 
    hasBadFormat(valule1)){ 
    doSomething(); 
}else{ 
    doSomethingElse(); 
} 

O:

if(isNull(value1) || isToLong(value1) || hasBadFormat(valule1)){ 
    doSomething(); 
}else{ 
    doSomethingElse(); 
} 

Il problema che ho con questi due stili è che rende difficile per il mio occhio per trovare il codice nel vero blocco e separarlo dal condizionali, oppure è troppo difficile per l'occhio determinare la riga successiva corretta dopo un lungo condizionale su una singola riga, specialmente se l'istruzione if è già rientrata di alcune schede all'interno di una funzione o di altre istruzioni if.

sarebbe preferibile fare qualcosa di simile:

if( isNull(value1) || 
     isToLong(value1) || 
     hasBadFormat(valule1)){ 
    doSomething(); 
}else{ 
    doSomethingElse(); 
} 

o sarebbe questo stile meglio per far rientrare ogni nuova condizione in uno dei seguenti modi:

if(isNull(value1) || 
     isToLong(value1) || 
      hasBadFormat(valule1)){ 
    doSomething(); 
}else{ 
    doSomethingElse(); 
} 

if(isNull(value1) 
     || isToLong(value1) 
      || hasBadFormat(valule1)){ 
    doSomething(); 
}else{ 
    doSomethingElse(); 
} 

Qualcuno ha una codifica linea guida di stile (forse una politica di stile di codifica aziendale) che affronta questo problema in un modo diverso o migliore di quello che ho proposto? Quale è preferibile e puoi trovare qualche contro o pro per le soluzioni che ho menzionato?

risposta

8

La soluzione ovvia è spostare la parentesi aperta sulla linea successiva, proprio come Dio intendeva!

</flamebait>

+0

Questa è l'unica cosa che mi punta allo scoperto-tutore-on-proprio-- camp linea. – DaveE

+0

In realtà mi sono imbattuto in questa risposta perché è stata contrassegnata come di bassa qualità. Ma non riesco proprio a raccomandare la cancellazione. :) – helmbert

13
if(isNull(value1) || 
    isToLong(value1) || 
    hasBadFormat(valule1)) 
{ 
    doSomething(); 
} 
else 
{ 
    doSomethingElse(); 
} 

Ora si vede il vero blocco facilmente credo.

Naturalmente, io preferisco:

if(isNull(value1) 
    || isToLong(value1) 
    || hasBadFormat(valule1)) 
{ 
    doSomething(); 
} 
else 
{ 
    doSomethingElse(); 
} 

:-)

+0

Cosa succede se la politica di codifica della propria azienda afferma che è necessario emulare puri se i blocchi, in modo che le parentesi siano visualizzate sulla stessa riga dell'istruzione if? Quale delle mie due soluzioni preferiresti allora e ci sono problemi con loro che non ho riconosciuto? – Jayson

+0

Penso che il mio secondo esempio funzionerebbe piuttosto bene quando il tutore è uno della stessa linea. –

2

Dipende molto dalle preferenze e le convenzioni di persone con cui lavori, ma i primi due sono le due forme più comuni che ho visto . Tendo a preferire spostare il condizionale in più linee solo se è così lungo da richiedere lo scorrimento a sinistra-destra nel mio ide.

Questo è come vorrei scriverlo:

if(isNull(value1) ||  
    isToLong(value1) || 
    hasBadFormat(valule1)) 
{  
    doSomething(); 
} 
else 
{  
    doSomethingElse(); 
} 

A meno che condizionale non è abbastanza a lungo per costringermi a scorrere per vedere tutto. In caso contrario, lo farei:

if(isNull(value1) || isToLong(value1) || hasBadFormat(valule1)) 
{  
    doSomething(); 
} 
else 
{  
    doSomethingElse(); 
} 

E in questo caso, poiché sembra abbastanza breve, farei quest'ultimo.

21

Che ne dici di qualcosa del genere?

bool isValid = isNull(value1) || isToLong(value1) || hasBadFormat(valule1); 
if(isValid) 
{ 
    doSomething(); 
} 
else 
{ 
    doSomethingElse(); 
} 

Il condizionale viene spostato su un'altra riga, che potrebbe rendere più facile la lettura.

+0

Questo è molto più leggibile IMO. –

+0

+1 Proprio quello che stavo per rispondere. – Nifle

+0

Avevo appena pensato a questo ... Anche questa sembra una buona opzione, soprattutto dal momento che è possibile mantenere la lunghezza della linea di && o || isValid con il test successivo su ogni riga. – Jayson

1

Tendo a mettere gli operatori all'inizio della linea in modo che tutti loro.

Quindi, ecco un suggerimento:

if(isNull(value1) 
    || isTooLong(value1) 
    || hasBadFormat(valule1)) 
{ 
    doSomething(); 
} /* if */ 
else 
{ 
    doSomethingElse(); 
} /* else */ 

Ecco un altro:

if(0 
    || isNull(value1) 
    || isTooLong(value1) 
    || hasBadFormat(valule1)) 
/* ...etc... */ 

(Per & &, lo sarebbe se (1 & & un & & b), etc.)

Oppure:

if 
(
    isNull(value1) 
    || isTooLong(value1) 
    || hasBadFormat(valule1) 
) 
/* ...etc... */ 
-2

Sono probabilmente l'unico che fa in questo modo. Si chiama Horstmann Style ma lo faccio leggermente in modo diverso.

if (bool)  // comment 
{ dothis;   
    andthis;  
} else if (bool) // comment 
{ dothis;  
    andthis;   
} else   // comment 
{ dothis;   
    andthis;  
} 
5

Questa è l'alternativa che preferisco:

if(
    isValid = isNull(value1) || 
    isToLong(value1) || 
    hasBadFormat(valule1) 
) { 
    doSomething(); 
} 
else { 
    doSomethingElse(); 
} 
Problemi correlati