2011-03-29 10 views
8

Nota importante: esta pregunta no se trata de la superioridad de un estilo de arriostramiento sobre otro. Actualmente estoy cambiando de estilos para evaluar por mí mismo cuál creo que funciona mejor en mi situación, y me gusta Allman hasta 1TBS.1TBS para expresiones condicionales largas

Usuarios del estilo de refuerzo de 1TBS, ¿cómo formatear las condiciones largas en una declaración if y el código subsiguiente?

if ((this_is_the_first_part_of_a_long_condition) 
    && (the_second_part_is_shorter__wait_no_it_is_not) 
    && (and_one_more_for_the_road)) { 
    here_comes_the_block_code(); 
} 

Creo que debe haber una manera mejor. Mi forma actual es agregar una línea vacía antes de la primera línea del bloque de código. Allman tampoco se ve muy bien en este caso, aunque es más legible en mi opinión.

Otro ejemplo con for bucles:

for (int relevant_counter_variable_name = START_VALUE; 
    intelligent_expression_that_may_include_the_counter_variable; 
    relevant_counter_variable_update) { 
    first_code_line_inside_the_block(); 
} 

No tan agradable ...

KNF (8) espacios guión ayudarían aquí, pero me gustaría evitar eso. Tengo algunas otras opciones, pero me gustaría saber si hay algún tipo de forma estándar.

+6

Este es exactamente el caso en el que cambiar temporalmente al estilo de Allman, y puse la llave de apertura en su propia línea alineada con la llave de cierre. Hay quienes gritarán y bromearán sobre "mezclar estilos", pero creo que es un código legible. (La última regla de la guía de George Orwell para escribir con claridad es "romper cualquiera de estas reglas en lugar de decir algo francamente bárbaro"). ¿Puedes decir por qué piensas que "no se ve muy bien"? – librik

+0

@librik: aunque el inicio del bloque (corchete de apertura) no es realmente parte del 'si', me gusta el hecho de que Allman lo coloca justo debajo del primer caracter de la palabra clave. Mi ojo los junta, y lo hace muy rápido. Si la condición se extiende a través de varias líneas, el 'if' y el' {'se ven separados y puedo oírlos llorar. En serio, simplemente no parece tan obvio que están en la misma columna. – Gauthier

+1

Aquí estoy con librik: es más importante hacer que el código sea legible que seguir mecánicamente un estilo. Ha encontrado casos en los que la "regla" tal vez debería verse como una recomendación: siga su estilo preferido, excepto cuando no funcione. Personalmente sigo el estilo Allman todo el tiempo, y no me he encontrado con esto. :-) –

Respuesta

9
if (
    (this_is_the_first_part_of_a_long_condition) 
    && (the_second_part_is_shorter__wait_no_it_is_not) 
    && (and_one_more_for_the_road) 
) { 
    here_comes_the_block_code(); 
} 
+1

Así es como tiendo a hacerlo. – Gauthier

+0

Ahora necesito decir 'clang-format' para cumplir: '( – Gauthier

1

Mix-n-partido


Estoy de acuerdo en que los estilos de mezcla es a menudo mal visto.
Pero, me atrevo a decir que siempre que sea posible, la regla puede doblarse para facilitar la lectura.

En los casos en que el estilo es estrictamente forzada, (empresa de codificación-políticas)
que suelo hacer esto:

if ( (this_is_the_first_part_of_a_long_condition) &&  
     (the_second_part_is_shorter__wait_no_it_is_not) && 
     (and_one_more_for_the_road)) { 
       here_comes_the_block_code(); 
} 

Sólo tiene que utilizar un nivel de guiones para todas las condiciones,
y otro nivel adicional para el código dentro de las llaves.
Esto es lo más legible posible, sin ofender a ningún purista.

9

I líneas continuas de doble guión:

if ((this_is_the_first_part_of_a_long_condition) 
     && (the_second_part_is_shorter__wait_no_it_is_not) 
     && (and_one_more_for_the_road)) { 
    here_comes_the_block_code(); 
} 
0

espacio único para cada nivel de sangría, utilizan paréntesis para cada condición si necesita o no.

Para condiciones complicadas, los paréntesis de estilo Allman pueden funcionar bien.

El enfoque general funciona para la continuación del código que no cabe en una línea, o para listas de argumentos de función.

Cada elemento de cierre está indentado al mismo nivel que el elemento de apertura, de ahí el "));" para "Trace.WriteLine (String.Format (" y el independiente ";" para "devolver".

YMMV.

if (
    (
    (this_is_the_first_part_of_a_long_condition) && 
    (the_second_part_is_shorter__wait_no_it_is_not) && 
    (and_one_more_for_the_road) 
    ) || 
    (
    (this_is_the_first_part_yet_another) && 
    (
     (the_second_part_yet_another) || 
     (val < 22) 
    ) 
    ) 
    ) { 
     here_comes_the_block_code(); 

     int bits = 0 
     | O_DEF 
     | CONFIG_THIS 
     | CONFIG_THAT 
     ; 

     FILE *OUPT = fopen(
     "/tmp/oupt.txt", 
     "a+" 
    ); 

     Trace.WriteLine(String.Format(
     "format {0} 0x{1:x8}" 
     ,(eGenericDeviceFeatureEnum)val 
     ,val & 0x7ffffc00 
    )); 

     return 
     (CurrentWort != null) && 
     (CurrentWort.IsFeatureSupported(
     eGenericDeviceFeatureEnum.SupportsTriBromoCarcinogen 
     )) 
     ; 
    } 
2

simplemente que perdería unas pocas variables para absoluta claridad y legibilidad:

cond1 = this_is_the_first_part_of_a_long_condition; 
cond2 = the_second_part_is_shorter__wait_no_it_is_not; 
cond3 = and_one_more_for_the_road; 
if (cond1 && cond2 && cond3) { 
    here_comes_the_block_code(); 
} 

No! 1TBS en todo su esplendor Sin estilo de mezcla. Sin fealdad La sangría (1) puede ocuparse de ella sin /* *INDENT-OFF* */ hacer trampa.

Incluso se puede dar a las condiciones nombres significativos, como

guidance = this_is_the_first_part_of_a_long_condition; 
navigation = the_second_part_is_shorter__wait_no_it_is_not; 
surgeon = and_one_more_for_the_road; 
if (guidance && navigation && surgeon) { 
    capcom_we_are_go_for_powered_descent(); 
} else { 
    agc_alarm(1202); 
} 
Cuestiones relacionadas