Cum de a îmbunătăți acest cod? (Prea multe dacă)

voturi
1

Vreau să imprimați granița pătrat ... Se poate imprima doar o parte, sau mai multe laturi ale pătrat, așa că am scris această metodă

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 poate lucra bine, dar cred că nu este atât de elegant, este prea multe, dacă, și toate declarația este mai mult sau mai puțin la fel. Cred că trebuie să existe o modalitate de a simplifica aceste coduri, orice sugestii?

Întrebat 08/08/2009 la 08:52
sursa de către utilizator
În alte limbi...                            


6 răspunsuri

voturi
5

O modalitate de a simplifica ... efectua apeluri, chiar dacă nu aveți nevoie de ele, dar conditionalise punerea în aplicare:

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

Apoi , în Square(sau orice altceva):

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

O alternativă similară ar fi de a menține condițional printBordercu funcția inițială:

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);
}
Publicat 08/08/2009 la 09:00
sursa de către utilizator

voturi
5

Nu aș pasă de FI. Mi-ar face doar mai ușor de citit:

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);
}
Publicat 08/08/2009 la 09:03
sursa de către utilizator

voturi
3

Personal, îmi place foarte mult comparații binare.

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

Unii ar putea spune că acest lucru face codul in interiorul functiei mai greu de citit. Cu toate acestea, gândirea mea este că există doar o singură apariție a acestei funcții în timp ce vă va suna această funcție peste tot. Dacă executați printr-un cod pe care nu ați uitat la un timp în care este mai ușor de citit?

printBorder(true, false, true, true);

sau

printBorder(NORTH + SOUTH + EAST);

Doar opinia mea. :)

Publicat 08/08/2009 la 09:26
sursa de către utilizator

voturi
3

Mai întâi faci bine, acest lucru face exact ceea ce exprimă, nu vă faceți griji cu privire la spațiul pe care îl utilizați, cele mai multe dintre soluțiile de aici doar plin de noroi apa.

Dacă doriți într-adevăr să „fac“ ceva uita, dacă nu puteți muta parametrul de frontieră în piață. ai putea muta capitonarea de frontieră (10 în exemplul dvs. în pătrat), eventual, de asemenea, statul care ar trebui să fie prezentat la frontieră, și apoi apel doar square.printBorders (). Asta depinde foarte mult de contextul în care sunt utilizați acest lucru.

Publicat 08/08/2009 la 14:14
sursa de către utilizator

voturi
1

nu ați specificat ce limbaj de programare.

dacă ar fi java, enums poate oferi bună sintaxă ușor de citit, de siguranță de tip, precum și să profite de capacitățile eficiente-jonglarea biți ale implementării EnumSet.

Alternativ, ar putea oferi, de asemenea, o metodă de semnătură varargs, dar atunci nu poate fi sigur că metoda va fi numit cu printBorder (N, N), care nu prea are sens. folosind interfața EnumSet aveți această garanție.

  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..
        }
    }
}
Publicat 08/08/2009 la 14:49
sursa de către utilizator

voturi
3

Ce zici de:

square.printBorder(N|E|W?0:10, N|S|W?0:10, N?0:10, N|E|S?10:0);
Publicat 08/08/2009 la 14:53
sursa de către utilizator

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