2010-12-06 9 views
9

aquí tienes hipotético ejemplo de código:primeros resultados positivos frente a anidar sentencias if

if (e.KeyCode == Keys.Enter) 
{ 
    if (this.CurrentElement == null) { 
     return false;} 

    if (this.CurrentElement == this.MasterElement) { 
     return false;} 

    if (!Validator.Exist (this.CurrentElement)) { 
     return false;} 

    if (!Identifier.IsPictureElement (this.CurrentElement)) { 
     return false;} 

    this.FlattenObjects(this.CurrentElement); 
} 

VS

if (e.KeyCode == Keys.Enter) 
{ 
    if (this.CurrentElement != null) { 

     if (this.CurrentElement != this.MasterElement) { 

      if (Validator.Exist (this.CurrentElement)) { 

       if (Identifier.IsPictureElement (this.CurrentElement)) { 

        this.FlattenObjects(this.CurrentElement);}}}}}} 

} 

Cuál cree usted que es mejor en términos de facilidad de lectura, mantenimiento, etc.?

También el segundo ejemplo se puede formatear de forma diferente mediante el uso diferente de paréntesis.

+18

Ese es uno de los peores estilos de corsé que he visto en mi vida. – SLaks

+0

Hehe, realmente vi un código real como ese. Pero lamento haberme apresurado a escribirlo así, se vería mejor con el horquillado correcto. –

+1

http://stackoverflow.com/questions/237719/what-is-the-most-frustrating-programming-style-youve-encountered/930831#930831 – SLaks

Respuesta

14

Las devoluciones anticipadas son mucho más legibles.

Cada vez que obtenga más de cuatro o cinco niveles de anidación dentro de un método, es hora de refactorizar ese método.

Una sola if con una cláusula || a veces puede ser más fácil de leer:

if (this.CurrentElement == null 
|| this.CurrentElement == this.MasterElement 
|| !Validator.Exist(this.CurrentElement) 
|| !Identifier.IsPictureElement(this.CurrentElement)) 
    return false; 
+0

Gracias, es un estilo interesante. Pero, ¿cómo lo formatearías con 4-5 niveles de anidación, lo que significa 4-5 controles, ¿verdad? Entonces, el método anterior, ¿lo refactorizaría, en términos de dividirlo en diferentes métodos? –

+0

@Joan: depende completamente del código. Sin embargo, es posible que desee crear un método separado que haga toda la verificación y devuelva 'true' o' false'. – SLaks

+0

Gracias, lo tengo. Es solo que a veces, obtienes estos casos únicos e independientes que requieren muchos controles, pero no se pueden combinar fácilmente en menos métodos, pero entiendo a qué te refieres. –

1

Creo que lo escribiría como:

if (this.CurrentElement == null OR this.CurrentElement == this.MasterElement OR ...) return false; 
+0

Yo también, pero en varias líneas y con la sintaxis correcta. – SLaks

+0

Ony con nuevas líneas? –

+0

Gracias, pero cuando hago eso, las líneas a veces son muy largas, digamos con 6 comprobaciones. –

4

El primer ejemplo es mejor en todos los sentidos. Es más simple y más fácil de leer. Algunas personas dicen que cada función debe tener un único punto de retorno; este ejemplo muestra claramente por qué esas personas están equivocadas.

PS Personalmente eliminaría todas esas llaves superfluos:

if (this.CurrentElement == null) return false; 

etc. Esto hace que sea aún más simple, y aún más fácil de leer.

+0

Creo que la mayoría de la gente tiene una idea equivocada de entrada única/salida única - vea [esta publicación] (http://softwareengineering.stackexchange.com/a/118793) – andreee

1

Yo diría que el primero es mejor para la legibilidad y el mantenimiento. Sin embargo, probablemente escribiría algo como esto.

if (e.KeyCode == Keys.Enter) { 
    if(this.CurrentElement == null || 
     this.CurrentElement == this.MasterElement || 
     !validator.exists(this.CurrentElement) || 
     !identifier.isPictureElement(this.CurrentElement)) 
    { 
     return false; 
    { 
    else 
    { 
     this.flattenObjects(this.CurrentElement); 
    } 
} 
+0

Gracias pero no son clases, se supone que los métodos son PascalCase? –

+0

Estaba asumiendo Java, y ese validador/identificador eran objetos. – OrangeDog

+0

Ok, veo lo que quieres decir. Sí, siempre estoy pensando en el modo C#/.NET, pero esta técnica sigue siendo válida, por supuesto. –

1

Teniendo en cuenta que en el segundo ejemplo "falsa" es el cambio de todos los caminos, pero es más implícito que declarada por qué no acaba de hacer todas las declaraciones implícitamente falso y simplemente probar la condición de que uno es único?

Esto puede violar las pautas de estilo de alguien, pero lógicamente es el más breve.

if(e.KeyCode == Keys.Enter 
&& this.CurrentElement != null 
&& this.CurrentElement != this.MasterElement 
&& Validator.Exist (this.CurrentElement)      
&& Identifier.IsPictureElement (this.CurrentElement)) 
    this.FlattenObjects(this.CurrentElement); 
Cuestiones relacionadas