2011-12-12 11 views
5

Quando ho iniziato a sviluppare, ho seguito i tutorial che utilizzavano sempre {} (parentesi graffe) per racchiudere i blocchi. Tuttavia, quando ho iniziato a guardare il codice di altre persone (ad esempio classi su GitHub, o solo più codice in generale di ciò che un tutorial di base mostrerebbe), tuttavia ho visto anche dichiarazioni di blocco senza essere incluso in {}, ad esempio;Blocchi - parentesi graffe/senza parentesi graffe?

if($var < 15) 
    $string = 'Hello, Jimmy!'; 
elseif($var >= 15) 
    $string = 'Hello, Anne!'; 

è lo stesso di

if($var < 15) { 
    $string = 'Hello, Jimmy!'; 
} elseif($var >= 15) { 
    $string = 'Hello, Anne!'; 
} 

Non ho mai usato blocchi non racchiusi in {}, però ho usato oggi e sto iniziando a vedere l'efficacia di farlo (sembra un molto più pulito anche, come io spesso trovo le mie funzioni crivellati di {} dal loop, condizionali ecc

Quello che mi chiedo è,

a) ci sono limitazioni sui blocchi senza parentesi graffe (; Ho notato che il mio IDE è stato ritirato da un rientro dopo aver inserito una singola riga e restituito dopo un condizionale if()?

b) esistono buone pratiche, quando non si utilizza {}?

Qualsiasi risposta, in particolare quelle inc. lo sfondo/i documenti sulla convenzione dell'uso di parentesi graffe per blocchi rispetto a non usarli sarebbero molto apprezzati, poiché mi piacerebbe davvero capire l'uso di parentesi graffe :)!

+1

È una questione di preferenza. Non mi piace davvero ometterli, altri lo fanno. Se sei coerente, probabilmente stai bene. –

+0

Con questo bug piuttosto grave in SSL, direi che questa domanda è MOLTO pertinente. Si noti che * SEMPRE * utilizzando parentesi graffe avrebbe assicurato che questo problema non si fosse verificato. https://www.imperialviolet.org/2014/02/22/applebug.html – Alan

risposta

4

è possibile omettere il {} per una sola riga:

if(something) 
    do something else 

, tuttavia, non si può omettere e farlo andare avanti in questo modo:

if(something) 
    do one thing 
    do another 
    do some more 

L'esempio riportato sopra dovrebbe avere solo 1 elemento condizionale (il 'fai una cosa'). Il resto verrebbe eseguito senza condizioni.

E sì che ho visto il metodo sciatta prima senza la {}, io preferisco utilizzare {} per separare la logica, e la sua più facile da leggere.

Quindi attenersi a utilizzare {} nel codice.

+1

Ottima risposta completa! Mi limiterò a usarli :). Accetterò quando il timer scende. – Avicinnian

8

La pratica migliore è usarli sempre. È fin troppo facile che un altro sviluppatore arrivi e aggiunga una riga di codice o cancelli una riga di codice e interrompa completamente il condizionale involontariamente.

0

È necessario utilizzarli solo se è presente più di una riga di codice in seguito a parentesi graffa.

if($var) return true; 

stessa

if($var) { 
    return true; 
} 

Tuttavia, se si dispone di più di una linea che si deve racchiuderli tra parentesi graffe.

if($var) { 
$var += 1; 
$var2 = $var; 
return $var2 
} 

Personalmente ho smesso di usare loro quando una riga di codice seguita perché hai ragione, sembra più pulito, soprattutto se il suo tutto su una riga come l'istruzione superiore. Inoltre, il codice sarà più gestibile se si riducono le dichiarazioni else if e si utilizza semplicemente return per interrompere la funzione se lo if non riesce e se si continua a passare al successivo if su true. Può diventare davvero complicato molto velocemente con un sacco di istruzioni else if e il tuo non usare un interruttore. A parte le preferenze personali, se è solo una riga di codice che segue, perdi le parentesi.

AlienWebguy ha ragione quando si tratta di sviluppo professionale, usali in quel caso.

0

parentesi graffe sono opzionali se l'istruzione da eseguire dopo il condizionale o loop è una sola linea:

//This outputs "hello" 
$test = 1; 
if($test == 1) 
    echo "hello"; 

//This outputs "howdy" 
$test = 1; 
if($test == 2) 
    echo "hello"; 
    echo "howdy"; 

O se non ti circondi dichiarazioni a linea singola con bretelle è una questione di preferenze personali e potrebbe anche essere dettato da un documento in stile di codifica se stai lavorando a un progetto collaborativo. Personalmente non li uso mai per le singole affermazioni e permetto all'indentazione del mio codice di mostrare come è organizzato il codice ma se vedi il mio secondo esempio sopra questo è un caso che ho visto prima dove i bug si insinuano. Il codificatore crea un condizionale con un riga singola da eseguire in base a tale condizione. Quindi un altro coder entra e aggiunge una seconda riga ma si dimentica di aggiungere le parentesi. Quindi da quella prospettiva potresti dire di usarli sempre. Dipende molto dalle tue circostanze individuali.

1

Dipende principalmente dallo stile a cui sei abituato. http://en.wikipedia.org/wiki/Indent_style

if (some_error) 
    something(); //Will be executed only when some_error==true 
somethingelse(); //Will always be executed. 

Se non si utilizza parentesi solo la riga successiva è parte del if.

if (some_error) err1 = "bad1"; errorno=3; 

Naturalmente, nell'esempio precedente, errno sarà sempre 3 o meno some_error è vero o no.

E 'lo stesso con i cicli for

for (i = 0; i < 10; i++) 
    doSomething (i); 

Così i segni bretelle dove inizia e dove finisce. Non usarli significa che solo la riga successiva sarà influenzata dall'istruzione if, for, while, ....

Inoltre, le parentesi possono essere utilizzate per contrassegnare il blocco di codice. Quando eseguo il codice in C++, contrassegno sempre l'inizio e la fine di una chiamata GL con parentesi graffe.

glBegin(GL_TRIANGLES); // Drawing Using Triangles 
{ 
    glVertex3f(0.0f, 1.0f, 0.0f); // Top 
    glVertex3f(-1.0f,-1.0f, 0.0f); // Bottom Left 
    glVertex3f(1.0f,-1.0f, 0.0f); // Bottom Right 
} 
glEnd(); 

In questo modo è più facile leggere e individuare le chiamate glEnd mancanti.

Problemi correlati