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

它可以正常工作,但我认为它不是那么优雅,它太多了,而且所有陈述或多或少都相同。我认为必须有办法简化这些代码,有什么建议吗?

4

6 回答 6

5

简化它的一种方法...即使您不需要它们也可以进行调用,但要对实现进行条件化:

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);
}
于 2009-08-08T08:00:28.000 回答
5

我不会关心ifs。我只是让它更具可读性:

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);
}
于 2009-08-08T08:03:10.457 回答
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);

只是我的观点。:)

于 2009-08-08T08:26:41.860 回答
3

首先你做得很好,这正是它所表达的,不要担心你正在使用的空间,这里的大多数解决方案只是把水弄混了。

如果你真的想“做”一些事情,如果你不能将 Border 参数移动到正方形中。您可以移动边框填充(在您的示例中为 10 到正方形中),也可能是应显示边框的状态,然后只需调用 square.printBorders()。这在很大程度上取决于您使用它的上下文。

于 2009-08-08T13:14:02.100 回答
3

怎么样:

square.printBorder(N|E|W?0:10, N|S|W?0:10, N?0:10, N|E|S?10:0);
于 2009-08-08T13:53:13.283 回答
1

您没有指定哪种编程语言。

如果是 java,枚举可以提供良好的可读语法、类型安全,以及利用 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..
        }
    }
}
于 2009-08-08T13:49:04.430 回答