Hoe deze code te verbeteren? (Te veel, zo)

stemmen
1

Ik wil de rand van het plein af te drukken ... Het kan slechts één kant, of meer zijden van het plein af te drukken, dus schreef ik deze 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);
  }
}

Het kan prima werken, maar ik denk dat het niet zo elegant, het is te veel, zo, en al statement is min of meer hetzelfde. Ik denk dat er moet een manier om deze codes, suggesties te vereenvoudigen?

De vraag is gesteld op 08/08/2009 om 08:52
bron van user
In andere talen...                            


6 antwoorden

stemmen
5

Een manier om te vereenvoudigen ... bellen, zelfs als je ze niet nodig hebt, maar conditionalise de uitvoering:

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

Toen in Square(of wat dan ook):

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

Een soortgelijk alternatief zou zijn om de voorwaardelijke houden printBordermet de oorspronkelijke functie:

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);
}
antwoordde op 08/08/2009 om 09:00
bron van user

stemmen
5

Ik zou niet de zorg over de ifs. Ik zou gewoon het beter leesbaar:

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);
}
antwoordde op 08/08/2009 om 09:03
bron van user

stemmen
3

Persoonlijk vind ik echt binaire vergelijkingen.

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

Sommigen zullen zeggen dat dit maakt de code binnen de functie minder leesbaar. Echter, mijn denken is er slechts een enkel optreden van deze functie, terwijl u zal worden oproepen van deze functie all over the place. Als u door enkele code die wordt uitgevoerd bent u nog niet gekeken in een tijdje dat is beter leesbaar?

printBorder(true, false, true, true);

of

printBorder(NORTH + SOUTH + EAST);

Gewoon mijn mening. :)

antwoordde op 08/08/2009 om 09:26
bron van user

stemmen
3

Eerst moet je goed bezig zijn, betekent dit precies wat het uitdrukt, maak je geen zorgen te maken over de ruimte die u gebruikt, de meeste van de oplossingen die hier net modderig het water.

Als je echt wilt 'doen' iets uitzien als u de parameter Border niet kan verplaatsen naar het plein. kon je de grens padding de staat die grens moeten worden weergegeven bewegen (10 in uw voorbeeld in het plein), eventueel ook, en dan gewoon bellen square.printBorders (). Dat hangt sterk af van de context waarin u deze gebruikt.

antwoordde op 08/08/2009 om 14:14
bron van user

stemmen
1

u heeft niet aangegeven welke programmeertaal.

als het java, kan enums goed leesbare syntax, het type veiligheid te bieden, maar ook profiteren van de efficiënte-bit prutsen capaciteiten van de implementatie EnumSet.

als alternatief kun je ook een varargs methode handtekening, maar dan kun je niet zeker van zijn dat uw methode zal worden aangeroepen met printBorder (N, N), die niet echt zin heeft. met behulp van de EnumSet interface die u hebben die 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..
        }
    }
}
antwoordde op 08/08/2009 om 14:49
bron van user

stemmen
3

Wat dacht je van:

square.printBorder(N|E|W?0:10, N|S|W?0:10, N?0:10, N|E|S?10:0);
antwoordde op 08/08/2009 om 14:53
bron van user

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