Jak zlepšit tento kód? (Příliš mnoho if)

hlasů
1

Chci vytisknout hranici náměstí ... Může tisknout pouze na jedné straně, nebo více stran na náměstí, takže jsem napsal tuto metodu

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

To může fungovat dobře, ale myslím, že to není tak elegantní, je-li příliš mnoho, a všechny tvrzení je více či méně stejné. Myslím, že tam musí být nějaký způsob, jak zjednodušit kódů, nějaké návrhy?

Položena 08/08/2009 v 08:52
zdroj uživatelem
V jiných jazycích...                            


6 odpovědí

hlasů
5

Jeden způsob, jak zjednodušit to ... volat, i když je nepotřebujete, ale conditionalise provádě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);
}

Pak v roce Square(nebo cokoliv):

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

Podobnou možností by bylo, aby podmíněné printBorders původní funkce:

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);
}
Odpovězeno 08/08/2009 v 09:00
zdroj uživatelem

hlasů
5

Já bych nezajímá IFS. Jen bych dělat to čitelnější:

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);
}
Odpovězeno 08/08/2009 v 09:03
zdroj uživatelem

hlasů
3

Osobně se mi líbí binární porovnávání.

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

Někdo by mohl říci, že to dělá kód uvnitř funkce méně čitelné. Nicméně, moje myšlení je tam jen jeden výskyt této funkce, zatímco budete volat tuto funkci všude možně. Pokud vedete přes nějaký kód, který se podíval na za čas, který je srozumitelnější?

printBorder(true, false, true, true);

nebo

printBorder(NORTH + SOUTH + EAST);

Jen můj názor. :)

Odpovězeno 08/08/2009 v 09:26
zdroj uživatelem

hlasů
3

První děláte ok, to není přesně to, co vyjadřuje, nebojte se o prostor, který používáte, většina z řešení zde jen kalnou vodu.

Pokud opravdu chcete, aby ‚to‘ něco hledat, pokud nemůžete přesunout parametr hranice do náměstí. byste mohli přesunout hranice polstrování (10 v příkladu na náměstí), případně stát, který se má zobrazit hranice, a pak stačí zavolat square.printBorders (). To záleží hodně na kontextu, ve kterém se toto použití.

Odpovězeno 08/08/2009 v 14:14
zdroj uživatelem

hlasů
1

jste nezadali jaký programovací jazyk.

kdyby to bylo java, může výčty poskytnout dobré čitelnou syntax, bezpečnostní typ, stejně jako využít efektivních bitových-šmelení možnostmi implementace EnumSet.

Alternativně můžete také poskytují způsob podpis varargs, ale pak si nemůžete být jisti, že vaše metoda bude volána s printBorder (N, N), která není opravdu smysl. pomocí rozhraní EnumSet máte tuto záruku.

  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..
        }
    }
}
Odpovězeno 08/08/2009 v 14:49
zdroj uživatelem

hlasů
3

Co takhle:

square.printBorder(N|E|W?0:10, N|S|W?0:10, N?0:10, N|E|S?10:0);
Odpovězeno 08/08/2009 v 14:53
zdroj uživatelem

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