Pregunta

Quiero imprimir el borde de la plaza ... Se puede imprimir un solo lado, o más lados de la plaza, 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);
  }
}

Se puede trabajar muy bien, pero creo que no es tan elegante, es demasiado muchos, si, y toda afirmación es más o menos lo mismo. Creo que debe ser tiene una manera de simplificar estos códigos, alguna sugerencia?

¿Fue útil?

Solución

En lo personal, me gusta mucho 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 menos legible. Sin embargo, mi pensamiento es que sólo hay una sola aparición de esta función mientras se le llama a esta función por todo el lugar. Si se está ejecutando a través de un código que no has mirado en un tiempo que es más fácil de leer?

printBorder(true, false, true, true);

o

printBorder(NORTH + SOUTH + EAST);

A mi opinión. :)

Otros consejos

Una forma de simplificarlo ... hacer llamadas, incluso si no los necesita, pero conditionalise la aplicació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);
}

A continuación, 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 la printBorder condicional con 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);
}

No me importa el IFS. Yo acababa de hacerlo 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);
}

En primer lugar que está haciendo bien, esto es exactamente lo que expresa, no se preocupe por el espacio que está utilizando, la mayoría de las soluciones aquí sólo enturbiar el agua.

Si realmente quiere 'hacer' algo vistazo si no se puede mover el parámetro frontera hacia la plaza. se podía mover el relleno de borde (10 en el ejemplo a la plaza), posiblemente también el Estado que la frontera se debe mostrar, y luego simplemente llamar square.printBorders (). Eso depende mucho del contexto en el que está usando este.

¿Qué hay de:

square.printBorder(N|E|W?0:10, N|S|W?0:10, N?0:10, N|E|S?10:0);

no se ha especificado que el lenguaje de programación.

si se tratara de java, enumeraciones puede proporcionar una buena sintaxis legible, la seguridad de tipos, así como aprovechar las capacidades de bit-jugueteando eficiente de la aplicación EnumSet.

Como alternativa, también podría proporcionar un método varargs firma, pero luego no se puede estar seguro de que su método será llamado con printBorder (N, N), que no tiene mucho sentido. utilizando la interfaz EnumSet tiene 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..
        }
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top