2009-08-08 61 views
1

我要打印的正方形边框... 它可以只打印一面,或广场的多个边,所以我写了这个方法如何改进此代码? (太多IF)

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

它可以正常工作,但我认为它不是那么优雅,如果太多了,而且所有的陈述都差不多一样。我认为必须有一种方法来简化这些代码,有什么建议吗?简化IT的

回答

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

只是我的意见。 :)

+0

我喜欢二进制比较过。 只需修复所有情况下相同的“square.printBorder” – ThibThib 2009-08-08 09:12:58

+0

哎呦。谢谢。这就是我在酒吧之后的凌晨2点30分发布的内容。 – 2009-08-08 15:25:37

+1

另外,我不会将位掩码与加法结合在一起 - 如果您曾经两次包含北边界,那就是要求提供错误。更好地printBorder(NORTH | SOUTH | EAST); – 2009-08-08 16:09:28

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

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

如果你真的想'做'看看,如果你不能将边界参数移动到正方形。你可以将边框填充(在你的例子中是10)移动到正方形中,也可能是边框应该显示的状态,然后调用square.printBorders()。这很大程度上取决于您使用此的上下文。

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.. 
     } 
    } 
} 
3

如何:

square.printBorder(N|E|W?0:10, N|S|W?0:10, N?0:10, N|E|S?10:0); 
+1

那样只能写一个边框。如果这是先决条件,那么这会因简明而获胜。 – 2009-08-08 14:19:17

+0

+1。我喜欢这个。 – 2009-08-08 15:30:37