Wie dieser Code zu verbessern? (Zu viele if)

stimmen
1

Ich mag die Grenze des Platzes drucken ... Es kann nur eine Seite oder mehr Seiten des Platzes drucken, so schrieb ich diese Methode

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);
  }
}

Es kann gut funktionieren, aber ich denke, es ist nicht so elegant ist, ist es zu viele, wenn, und alle Aussage ist mehr oder weniger das gleiche. Ich denke, es muss eine Möglichkeit haben, diese Codes zu vereinfachen, irgendwelche Vorschläge?

Veröffentlicht am 08/08/2009 um 08:52
quelle vom benutzer
In anderen Sprachen...                            


6 antworten

stimmen
5

Eine Möglichkeit zur Vereinfachung es ... Anrufe tätigen, selbst wenn Sie sie nicht brauchen, aber conditionalise die Umsetzung:

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);
}

Dann in Square(oder was auch immer):

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

Eine ähnliche Alternative wäre die bedingten zu halten printBordermit der ursprünglichen Funktion:

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);
}
Beantwortet am 08/08/2009 um 09:00
quelle vom benutzer

stimmen
5

Ich würde über die ifs nicht. Ich würde einfach machen es besser lesbar:

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);
}
Beantwortet am 08/08/2009 um 09:03
quelle vom benutzer

stimmen
3

Persönlich Ich mag wirklich binäre Vergleiche.

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);
}

Man könnte sagen, dass dies den Code innerhalb der Funktion weniger lesbar macht. Allerdings ist mein Denken nur eine einzige Vorkommen dieser Funktion ist, während Sie diese Funktion in dem ganzen Ort werden anrufen. Wenn Sie durch einige Code ausführen haben Sie nicht in eine Weile sah, die besser lesbar ist?

printBorder(true, false, true, true);

oder

printBorder(NORTH + SOUTH + EAST);

Nur meine Meinung. :)

Beantwortet am 08/08/2009 um 09:26
quelle vom benutzer

stimmen
3

Zuerst ok tun, das ist genau das, was es ausdrückt, keine Sorge über den Raum, die Sie verwenden, die meisten Lösungen hier nur schlammig das Wasser.

Wenn Sie wirklich wollen, zu ‚tun‘ etwas aus, wenn Sie nicht die Border-Parameter auf den Platz bewegen können. Sie könnte die Grenze Polsterung (10 in Ihrem Beispiel auf den Platz), möglicherweise auch den Staat bewegen, die Grenze angezeigt werden soll, und dann square.printBorders nur () aufrufen. Das hängt viel von dem Kontext, in dem Sie diese verwenden.

Beantwortet am 08/08/2009 um 14:14
quelle vom benutzer

stimmen
1

Sie haben angeben, welche Programmiersprache nicht.

wenn es Java sind, können Aufzählungen eine gute lesbare Syntax, gibt Sicherheit, sowie die Vorteile der effizienten Bit-Hantieren Fähigkeiten der EnumSet Umsetzung nehmen.

Alternativ können Sie auch eine varargs Methodensignatur, bieten aber dann kann man nicht sicher sein, dass Ihre Methode mit printBorder (N, N) bezeichnet werden, die nicht wirklich Sinn machen. mit der EnumSet Schnittstelle haben Sie diese Garantie.

  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..
        }
    }
}
Beantwortet am 08/08/2009 um 14:49
quelle vom benutzer

stimmen
3

Wie wäre es mit:

square.printBorder(N|E|W?0:10, N|S|W?0:10, N?0:10, N|E|S?10:0);
Beantwortet am 08/08/2009 um 14:53
quelle vom benutzer

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