2009-08-08 1 views
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); 
    } 
} 

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

ответ

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

+0

Упс. Благодарю. Это то, что я получаю для публикации в 2.30 утра после бара. –

+1

Кроме того, я бы не совмещал битмаски с добавлением - это запрос об ошибках, если вы когда-либо включали северную границу дважды, скажем. Лучше печататьBorder (NORTH | SOUTH | EAST); –

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

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

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.

В качестве альтернативы вы также можете предоставить подпись метода 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.. 
     } 
    } 
} 
3

Как насчет:

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

таким образом можно написать только одну границу. если это предпосылка, это выиграло бы для краткости. –

+0

+1. Мне это нравится. –

 Смежные вопросы

  • Нет связанных вопросов^_^