我想打印广场的边框...... 它可能只打印方块的一侧或更多边,所以我写了这个方法
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);
}
}
它可以正常工作,但我认为它不是那么优雅,如果它太多了,并且所有陈述都或多或少相同。我认为必须有办法简化这些代码,任何建议?
答案 0 :(得分: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);
}
答案 1 :(得分: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);
}
答案 2 :(得分: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);
只是我的意见。 :)
答案 3 :(得分:3)
首先,你做得很好,这完全是它所表达的,不要担心你正在使用的空间,这里的大多数解决方案只是让水变得混乱。
如果你真的想'做'某些东西看起来如果你不能将Border参数移动到正方形中。你可以移动边框填充(在你的例子中10到方块),也可能是显示边框的状态,然后只需调用square.printBorders()。这在很大程度上取决于你使用它的背景。
答案 4 :(得分:3)
怎么样:
square.printBorder(N|E|W?0:10, N|S|W?0:10, N?0:10, N|E|S?10:0);
答案 5 :(得分:1)
您没有指定哪种编程语言。
如果是java,枚举可以提供良好的可读语法,类型安全性,以及利用EnumSet实现的高效比特功能。
或者您也可以提供varargs方法签名,但是您不能确定将使用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..
}
}
}