Hvordan forbedre denne koden? (For mange hvis)

stemmer
1

Jeg ønsker å skrive ut grensen av plassen ... Det kan bare skrive ut en side eller flere sider av plassen, så jeg skrev denne metoden

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

Det kan fungere fint, men jeg tror det ikke er så elegant, det er for mange om, og alle utsagn er mer eller mindre det samme. Jeg tror det må være en måte å forenkle dette koder, noen forslag?

Publisert på 08/08/2009 klokken 07:52
kilden bruker
På andre språk...                            


6 svar

stemmer
5

En måte å forenkle det ... ringe selv om du ikke trenger dem, men conditionalise gjennomføringen:

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

Deretter i Square(eller hva):

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

En lignende alternativ ville være å holde betinget printBordermed den opprinnelige funksjon:

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);
}
Svarte 08/08/2009 kl. 08:00
kilden bruker

stemmer
5

Jeg ville ikke bryr seg om ifs. Jeg vil bare gjøre den mer 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);
}
Svarte 08/08/2009 kl. 08:03
kilden bruker

stemmer
3

Personlig, jeg liker binære sammenligninger.

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

Noen vil kanskje si at dette gjør koden inne funksjonen mindre lesbar. Men det er min tro at det er bare en enkelt forekomst av denne funksjonen mens du skal ringe denne funksjonen over alt. Hvis du kjører gjennom noen kode du ikke har sett på en stund som er mer lesbar?

printBorder(true, false, true, true);

eller

printBorder(NORTH + SOUTH + EAST);

Bare min mening. :)

Svarte 08/08/2009 kl. 08:26
kilden bruker

stemmer
3

Først du gjør ok, dette gjør akkurat hva det uttrykker, ikke bry deg om den plassen du bruker, de fleste av løsningene her bare gjørmete vannet.

Hvis du virkelig ønsker å 'gjøre' noe ut hvis du ikke kan flytte Border parameter inn på torget. du kan flytte grensen padding (10 i ditt eksempel inn på torget), muligens også staten som grenser skal vises, og deretter bare ringe square.printBorders (). Det avhenger mye av konteksten der du bruker dette.

Svarte 08/08/2009 kl. 13:14
kilden bruker

stemmer
1

du ikke spesifisere hvilke programmeringsspråk.

om det var java, kan enums gi god lesbar syntaks, type sikkerhet, samt dra nytte av de effektive bit-fikling mulighetene i EnumSet gjennomføring.

Alternativt kan du også gi en varargs metode signatur, men da kan du ikke være sikker på at metoden vil bli kalt med printBorder (N, N), som egentlig ikke gir mening. bruker EnumSet grensesnittet du har denne garantien.

  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..
        }
    }
}
Svarte 08/08/2009 kl. 13:49
kilden bruker

stemmer
3

Hva med:

square.printBorder(N|E|W?0:10, N|S|W?0:10, N?0:10, N|E|S?10:0);
Svarte 08/08/2009 kl. 13:53
kilden bruker

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