Comment améliorer ce code? (Trop si)

voix
1

Je veux imprimer la frontière de la place ... Il peut imprimer un seul côté, ou plusieurs côtés de la place, donc j'écrit cette méthode

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

Il peut fonctionner très bien, mais je pense que ce n'est pas si élégant, il est trop si, et toute déclaration est plus ou moins la même chose. Je pense qu'il doit y avoir avoir un moyen de simplifier ces codes, des suggestions?

Créé 08/08/2009 à 08:52
source utilisateur
Dans d'autres langues...                            


6 réponses

voix
5

Une façon de simplifier ... faire des appels, même si vous ne les avez pas besoin, mais conditionalise la mise en œuvre:

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

Puis , en Square(ou autre):

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

Une alternative similaire serait de garder le conditionnel printBorderavec la fonction d' origine:

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);
}
Créé 08/08/2009 à 09:00
source utilisateur

voix
5

Je ne se soucient pas du ifs. Je venais de le rendre plus lisible:

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);
}
Créé 08/08/2009 à 09:03
source utilisateur

voix
3

Personnellement, j'aime vraiment des comparaisons binaires.

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

Certains pourraient dire que cela rend le code dans la fonction moins lisible. Cependant, ma pensée est qu'il n'y a qu'une seule occurrence de cette fonction alors que vous appellerez cette fonction dans tous les sens. Si vous utilisez par un code que vous ne l'avez pas regardé en temps qui est plus lisible?

printBorder(true, false, true, true);

ou

printBorder(NORTH + SOUTH + EAST);

Juste mon avis. :)

Créé 08/08/2009 à 09:26
source utilisateur

voix
3

D'abord, vous faites bien, cela fait exactement ce qu'il exprime, ne vous inquiétez pas l'espace que vous utilisez, la plupart des solutions ici juste l'eau boueuse.

Si vous voulez vraiment « faire » quelque chose regarder si vous ne pouvez pas déplacer le paramètre frontière sur la place. vous pouvez déplacer le rembourrage de bordure (10 dans votre exemple sur la place), peut-être aussi l'Etat qui devrait être montré frontière, puis il suffit d'appeler square.printBorders (). Cela dépend beaucoup du contexte dans lequel vous utilisez ce.

Créé 08/08/2009 à 14:14
source utilisateur

voix
1

vous n'avez pas spécifié quel langage de programmation.

si elle était java, énumérations peut fournir une bonne syntaxe lisible, la sécurité de type, ainsi que de tirer parti des capacités de bit-tripoter efficace de la mise en œuvre EnumSet.

Sinon, vous pouvez également fournir une signature de méthode varargs, mais vous ne pouvez pas être sûr que votre méthode sera appelée avec printBorder (N, N), qui ne fait pas vraiment de sens. en utilisant l'interface EnumSet vous avez cette garantie.

  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..
        }
    }
}
Créé 08/08/2009 à 14:49
source utilisateur

voix
3

Que diriez-vous:

square.printBorder(N|E|W?0:10, N|S|W?0:10, N?0:10, N|E|S?10:0);
Créé 08/08/2009 à 14:53
source utilisateur

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