2011-12-12 11 views
5

Cuando comencé a desarrollar, seguí tutoriales que siempre usaban {} (llaves) para encerrar bloques. Sin embargo, cuando comencé a buscar código de otras personas (clases en GitHub, por ejemplo, o simplemente más código en general de lo que mostraría un tutorial básico), también he visto instrucciones de bloque sin estar encerradas en {}, por ejemplo;Bloques - ¿llaves/sin llaves?

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

es la misma que

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

nunca he utilizado bloques no encerrados en {}, sin embargo he usado hoy y estoy empezando a ver la eficiencia de hacerlo (se ve una mucho más limpio también, como a menudo a encontrar mis funciones plagados de {} de bucles, condicionales, etc.

lo que estoy pidiendo es;

a) hay limitaciones en los bloques sin llaves (; Me di cuenta de que mi IDE se retiró de una sangría después de que ingresé a una línea y volví después de un if() condicional.

b) ¿hay alguna práctica recomendada, cuando no se usa {}?

Cualquier respuesta, específicamente aquellas inc. background/docs en la convención del uso de llaves para bloques vs. no usarlos sería muy apreciado, ya que realmente me gustaría entender el uso de llaves :).

+1

Es una cuestión de preferencia. Realmente no me gusta omitirlos, otros lo hacen. Si eres consistente, probablemente estés bien. –

+0

Con este error bastante importante en SSL, diría que esta pregunta es MUY pertinente. Tenga en cuenta que * SIEMPRE * con llaves se habría asegurado de que este problema no ocurriera. https://www.imperialviolet.org/2014/02/22/applebug.html – Alan

Respuesta

4

se puede omitir el {} por una sola línea:

if(something) 
    do something else 

sin embargo no se puede omitir y tenerlo a seguir adelante de esta manera:

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

El ejemplo anterior sólo tendría 1 elemento condicional (el 'hacer una cosa'). El resto simplemente funcionaría incondicionalmente.

Y sí, he visto el método descuidado antes sin el {}, yo prefiero usar {} para separar la lógica, y es más fácil de leer.

Así que quédese usando {} en su código.

+1

¡Gran respuesta completa! Me quedaré con su uso :). Aceptaré cuando el temporizador se caiga. – Avicinnian

8

La mejor práctica es usarlos siempre. Es demasiado fácil para otro desarrollador aparecer y agregar una línea de código o eliminar una línea de código y romper completamente el condicional involuntariamente.

0

Solo tiene que usarlos si hay más de una línea de código después de una llave.

if($var) return true; 

mismo que

if($var) { 
    return true; 
} 

Sin embargo, si usted tiene más de una línea que debe encerrarlas entre llaves.

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

Personalmente dejado de usarlas cuando una línea de código seguido porque tiene usted razón, se ve más limpia, especialmente si su todo en una línea como la declaración de la parte superior. También, su código será más manejable si reduce las declaraciones else if y simplemente usa return para detener la función si el if falla y simplemente continúa con el siguiente if en true. Puede ser muy complicado muy rápido con un montón de declaraciones else if y no está utilizando un interruptor. Además de las preferencias personales, si solo se trata de una línea de código siguiente, pierda los frenos.

AlienWebguy tiene razón cuando se trata de desarrollo profesional, úselas en ese caso.

0

Las llaves son opcionales si la instrucción que se ejecutará después del condicional o bucle es sólo una sola línea:

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

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

Independientemente de si usted se rodea declaraciones de una sola línea con los apoyos es una cuestión de preferencia personal y también puede estar dictado por un documento de estilo de codificación si está trabajando en un proyecto colaborativo. Personalmente, nunca los utilizo para sentencias únicas y para permitir que la sangría de mi código muestre cómo está organizado el código, pero si ven mi segundo ejemplo anterior, este es un caso que he visto antes en el que aparecen errores. El codificador crea un condicional con un línea única que se ejecutará en función de esa condición. Luego, entra otro codificador y agrega una segunda línea, pero se olvida de agregar las llaves. Entonces, desde esa perspectiva, puedes decir que siempre los uses. Depende mucho de tus circunstancias individuales.

1

En su mayoría depende del estilo al que está acostumbrado. http://en.wikipedia.org/wiki/Indent_style

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

Si usted no utiliza los apoyos solamente la siguiente línea es parte de la sentencia if.

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

Por supuesto, en el ejemplo anterior, errno siempre será 3 independientemente de si cierto_serror es verdadero o no.

Es lo mismo con los bucles

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

Así que las marcas de aparatos ortopédicos donde empieza y donde termina. No usarlos significa que solo la próxima línea se verá afectada por la declaración if, for, while, ...

Además, las llaves se pueden usar para marcar el bloque de código. Cuando codigo en C++ siempre marco el inicio y el final de una llamada GL con llaves.

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(); 

De esta manera es más fácil de leer y detectar las llamadas que faltan.