¿Cómo mejorar este código? (demasiados si)

votos
1

Quiero imprimir el borde del cuadrado ... Puede imprimir solo un lado, o más lados del cuadrado, así que escribí este método

printBorder(N, E, S, W) {
  if (N) {
     square.printBorder(0,0,0,10);
  }
  if (E) {
     square.printBorder(0,10,10,10);
  }
  if (S) {
     square.printBorder(10,0,10,10);
  }
  if (W) {
     square.printBorder(0,0,10,0);
  }
}

Puede funcionar bien, pero creo que no es tan elegante, es demasiados si, y todos los enunciados son más o menos lo mismo. Creo que debe haber una forma de simplificar estos códigos, ¿alguna sugerencia?

Publicado el 08/08/2009 a las 08:52
fuente por usuario
En otros idiomas...                            


6 respuestas

votos
5

Una forma de simplificarlo ... hacer llamadas incluso si no las necesitas, pero condicionalizar la implementación:

printBorder(N, E, S, W){
  square.printBorder(n, 0,0,0,10);
  square.printBorder(e, 0,10,10,10);
  square.printBorder(s, 10,0,10,10);
  square.printBorder(w, 0,0,10,0);
}

Luego en Square(o lo que sea):

printBorder(condition, top, left, bottom, right) {
  if (!condition) {
    return;
  }
  printBorder(top, left, bottom, right);
}

Una alternativa similar sería mantener el condicional printBordercon la función original:

printBorder(N, E, S, W){
  printBorder(n, 0,0,0,10);
  printBorder(e, 0,10,10,10);
  printBorder(s, 10,0,10,10);
  printBorder(w, 0,0,10,0);
}

printBorder(condition, top, left, bottom, right) {
  if (!condition) {
    return;
  }
  square.printBorder(top, left, bottom, right);
}
Respondida el 08/08/2009 a las 09:00
fuente por usuario

votos
5

No me importaría el ifs. Simplemente lo haría más legible:

printBorder(N, E, S, W){
  if(N) square.printBorder( 0,  0,  0, 10);
  if(E) square.printBorder( 0, 10, 10, 10);
  if(S) square.printBorder(10,  0, 10, 10);
  if(W) square.printBorder( 0,  0, 10,  0);
}
Respondida el 08/08/2009 a las 09:03
fuente por usuario

votos
3

Personalmente, realmente me gustan las comparaciones binarias.

const uint NORTH = 1;
const uint SOUTH = 2;
const uint EAST = 4;
const uint WEST = 8;

// ... some code ...
printBorder(NORTH + EAST);
// ... some other code ...

printBorder(uint Sides)
{
   if((NORTH & Sides) > 0) square.printBorder(0, 0, 0, 10);
   if((SOUTH & Sides) > 0) square.printBorder(0, 10, 10, 10);
   if((EAST & Sides) > 0) square.printBorder(10, 0, 10, 10);
   if((WEST & Sides) > 0) square.printBorder(0, 0, 10, 0);
}

Algunos podrían decir que esto hace que el código dentro de la función sea menos legible. Sin embargo, mi pensamiento es que solo hay una sola aparición de esta función, mientras que llamarás a esta función por todos lados. Si está ejecutando algún código que no ha mirado por un tiempo, ¿qué es más legible?

printBorder(true, false, true, true);

o

printBorder(NORTH + SOUTH + EAST);

Solo es mi opinión. :)

Respondida el 08/08/2009 a las 09:26
fuente por usuario

votos
3

Primero lo está haciendo bien, esto hace exactamente lo que expresa, no se preocupe por el espacio que está utilizando, la mayoría de las soluciones aquí simplemente enturbian el agua.

Si realmente desea 'hacer' algo, mire si no puede mover el parámetro Border al cuadrado. puede mover el relleno de borde (10 en su ejemplo en el cuadrado), posiblemente también el Estado qué borde debe mostrarse, y luego simplemente llame a square.printBorders (). Eso depende mucho del contexto en el que estés usando esto.

Respondida el 08/08/2009 a las 14:14
fuente por usuario

votos
1

no especificaste qué lenguaje de programación.

si fuera Java, las enumeraciones pueden proporcionar una buena sintaxis legible, seguridad del tipo, así como aprovechar las capacidades eficientes de manipulación de bits de la implementación de EnumSet.

alternativamente, también podría proporcionar una firma de método varargs, pero luego no puede estar seguro de que se llamará a su método con printBorder (N, N), lo que realmente no tiene sentido. usando la interfaz EnumSet tienes esta garantía.

  public class PrintBorder {

    //this is your method without the if's
    public static void printBorder(EnumSet<Sides> sides) {
        for (Sides side : sides) {
            side.print(square);
        }
    }

    //use it like this
    public static void main(String[] args) {
        printBorder(EnumSet.of(N, E)); //static import here
    }

    //declare an enum for the sides.
    public enum Sides {
        N(0, 0, 0, 10),
        E(0, 10, 10, 10),
        S(10, 0, 10, 10),
        W(0, 0, 10, 0);

        private final int x1;
        private final int y1;
        private final int x2;
        private final int y2;

        Sides(int x1, int y1, int x2, int y2) {
            this.x1 = x1;
            this.y1 = y1;
            this.x2 = x2;
            this.y2 = y2;
        }

        //this method could as well be in the Square class, would be cleaner
        public void print(Square s) {
            s.printBorder(x1, y1, x2, y2);
        }

    }

    //boilerplate here
    private static final Square square = new Square();

    private static class Square {
        public void printBorder(int x1, int y1, int x2, int y2) {
            //do something..
        }
    }
}
Respondida el 08/08/2009 a las 14:49
fuente por usuario

votos
3

Qué tal si:

square.printBorder(N|E|W?0:10, N|S|W?0:10, N?0:10, N|E|S?10:0);
Respondida el 08/08/2009 a las 14:53
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more