2009-06-29 8 views
15

Mi pregunta se relaciona con this previous question, pero las soluciones ofrecidas no abordan el problema que he descrito a continuación. Después de una búsqueda en Google, no he encontrado ninguna guía de estilo de código que aborde el problema específico de los condicionalmente largos en una declaración if como esta.¿Cómo sangría long conditionals para declaraciones 'if'?

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

O:

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

El problema que tengo con estos dos estilos es que hace que sea difícil para el ojo para encontrar el código en el bloque verdadero y lo separan de los condicionales, o es es demasiado difícil para el ojo determinar la siguiente línea correcta después de una larga condicional en una sola línea, especialmente si la instrucción if ya tiene sangría algunas pestañas dentro de una función u otras declaraciones if.

¿Sería preferible hacer algo como esto:

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

o sería este estilo será mejor para sangrar cada nueva condición en cualquiera de estas maneras:

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

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

¿Alguien tiene una codificación guía de estilo (tal vez una política de estilo de codificación de la empresa) que aborda este problema de una manera diferente o mejor de lo que he propuesto? ¿Cuál es preferible y puede encontrar inconvenientes o ventajas en las soluciones que he mencionado?

Respuesta

8

La solución obvia es mover la abrazadera abierta a la siguiente línea, ¡tal como Dios quiso!

</flamebait>

+0

Esta es la única cosa que me avisó de la llave-en-en-su-propia abierta - línea de campamento. – DaveE

+0

En realidad, me encontré con esta respuesta porque estaba marcada como de baja calidad. Pero simplemente no puedo recomendar la eliminación. :) – helmbert

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

Ahora aparece el verdadero bloque fácilmente que pienso.

Por supuesto, prefiero:

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

:-)

+0

¿Qué ocurre si la política de codificación de su empresa establece que debe emular los bloques puros si los bloqueos aparecen en la misma línea que la instrucción if? ¿Cuál de mis dos soluciones preferiría entonces y hay algún problema con ellas que no haya reconocido? – Jayson

+0

Creo que mi segundo ejemplo funcionaría bastante bien cuando el corsé es uno de la misma línea. –

2

Realmente depende de la preferencia y la convención de las personas con las que trabaja, pero los dos primeros son las dos formas más comunes que he visto . Tiendo a preferir mover el condicional a líneas múltiples solo si es tan largo que requiere desplazamiento de izquierda a derecha en mi ide.

Esto es como lo escribiría:

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

A menos que condicional no es tiempo suficiente para obligarme a desplazarse para verlo todo. Si no es así, me gustaría hacer esto:

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

Y en este caso, ya que parece lo suficientemente corto, lo haría este último.

21

¿Qué tal algo así?

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

El condicional se mueve a otra línea, lo que podría facilitar la lectura.

+0

Esto es mucho más fácil de leer IMO. –

+0

+1 Justo lo que iba a responder. – Nifle

+0

Solo había pensado en esta ... Esta parece ser una buena opción también, especialmente porque puedes mantener la longitud de la línea hacia abajo en && o || isValid con la siguiente prueba en cada línea. – Jayson

1

Tiendo a poner los operadores al principio de la línea para que todos suban.

tanto, aquí está una sugerencia:

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

Aquí hay otro:

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

(Para & &, lo que sería si (1 & & un & & b), etc.)

O esto:

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

Probablemente soy el único que lo hace de esta manera. Se llama Horstmann Style, pero lo hago de forma ligeramente diferente.

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

Esta es la alternativa que prefiero:

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