Как улучшить этот код? (Слишком много если)

голоса
1

Я хочу напечатать границу квадрата ... Он может печатать только с одной стороны, или больше стороны квадрата, так что я написал этот метод

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

Он может работать нормально, но я думаю, что это не так элегантно, что это слишком много, если, и все утверждение более или менее то же самое. Я думаю, что должно быть есть способ упростить эти коды, любые предложения?

Задан 08/08/2009 в 08:52
источник пользователем
На других языках...                            


6 ответов

голоса
5

Один из способов упрощения это ... сделать звонки, даже если вы не нуждаетесь в них, но conditionalise реализации:

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

Тогда в Square(или любой другой ):

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

Подобная альтернатива будет держать условный printBorderс исходной функцией:

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);
}
Ответил 08/08/2009 в 09:00
источник пользователем

голоса
5

Я бы не заботиться о МФС. Я бы просто сделать его более удобным для чтения:

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);
}
Ответил 08/08/2009 в 09:03
источник пользователем

голоса
3

Лично мне очень нравится бинарные сравнения.

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

Кто-то может сказать, что это делает код внутри функции менее читаемым. Однако, мое мышление есть только одно вхождение этой функции в то время как вы будете вызывать эту функцию повсюду. Если вы работаете через какой-то код, который вы не смотрели на в какое-то время, которое является более читаемым?

printBorder(true, false, true, true);

или

printBorder(NORTH + SOUTH + EAST);

Просто мое мнение. :)

Ответил 08/08/2009 в 09:26
источник пользователем

голоса
3

Сначала вы делаете хорошо, это именно то, что оно выражает, не беспокойтесь о пространстве, которое вы используете, большинство решений здесь просто мутную воду.

Если вы действительно хотите, чтобы «делать» что-то смотреть, если вы не можете переместить параметр Border на площадь. вы могли бы переместить границы отступов (10 в вашем примере в квадрат), возможно, также государства, граничащие должны быть показаны, а затем просто вызвать square.printBorders (). Это во многом зависит от контекста, в котором вы используете это.

Ответил 08/08/2009 в 14:14
источник пользователем

голоса
1

Вы не указали, какой язык программирования.

если бы это было ява, перечисления могут обеспечить хороший читаемый синтаксис, безопасность типов, а также воспользоваться эффективным разрядным-пустячным возможностей реализации EnumSet.

в качестве альтернативы вы можете также предоставить метод подписи списков параметров, но тогда вы не можете быть уверены, что ваш метод будет вызываться с printBorder (N, N), который на самом деле не имеет смысла. с помощью интерфейса EnumSet вы имеете эту гарантию.

  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..
        }
    }
}
Ответил 08/08/2009 в 14:49
источник пользователем

голоса
3

Как насчет:

square.printBorder(N|E|W?0:10, N|S|W?0:10, N?0:10, N|E|S?10:0);
Ответил 08/08/2009 в 14:53
источник пользователем

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