Come migliorare questo codice? (Troppi se)

voti
1

Voglio stampare il confine della piazza ... Può stampare solo su un lato, o più lati della piazza, così ho scritto questo metodo

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

Può funzionare bene, ma penso che non è così elegante, è troppo molti se, e tutti affermazione è più o meno lo stesso. Penso che ci deve essere hanno un modo per semplificare questo i codici, qualche suggerimento?

È pubblicato 08/08/2009 alle 08:52
fonte dall'utente
In altre lingue...                            


6 risposte

voti
5

Un modo per semplificarla ... effettuare chiamate, anche se non ne hanno bisogno, ma conditionalise l'attuazione:

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

Poi, nel Square(o qualsiasi altra cosa):

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

Una simile alternativa sarebbe quella di mantenere il condizionale printBordercon la funzione originaria:

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);
}
Risposto il 08/08/2009 a 09:00
fonte dall'utente

voti
5

Non mi preoccupano IFS. Avevo appena renderlo più leggibile:

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);
}
Risposto il 08/08/2009 a 09:03
fonte dall'utente

voti
3

Personalmente, mi piace molto confronti binari.

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

Qualcuno potrebbe dire che questo rende il codice all'interno della funzione meno leggibile. Tuttavia, il mio pensiero è che c'è solo una singola occorrenza di questa funzione, mentre sarete chiamare questa funzione in tutto il luogo. Se si sta eseguendo attraverso un codice che non hai guardato per un po ', che è più leggibile?

printBorder(true, false, true, true);

o

printBorder(NORTH + SOUTH + EAST);

Solo la mia opinione. :)

Risposto il 08/08/2009 a 09:26
fonte dall'utente

voti
3

In primo luogo si sta facendo bene, questo è esattamente ciò che esprime, non ti preoccupare lo spazio che si sta utilizzando, la maggior parte delle soluzioni qui solo fangosa l'acqua.

Se davvero si vuole 'fare' qualcosa di guardare se non è possibile spostare il parametro di frontiera nella piazza. si potrebbe spostare l'imbottitura bordo (10 nel tuo esempio nella piazza), eventualmente anche lo Stato che dovrebbe essere mostrato confine, e poi basta chiamare square.printBorders (). Questo dipende molto dal contesto in cui si sta utilizzando questo.

Risposto il 08/08/2009 a 14:14
fonte dall'utente

voti
1

non è stato specificato che il linguaggio di programmazione.

se fosse java, enumerazioni possono fornire una buona sintassi leggibile, la sicurezza di tipo, così come sfruttare le efficienti capacità di attuazione EnumSet bit-giocherellare.

in alternativa, si potrebbe anche fornire un metodo di firma varargs, ma poi non si può essere sicuri che il vostro metodo sarà chiamato con printBorder (N, N), che in realtà non ha senso. utilizzando l'interfaccia EnumSet avete questa garanzia.

  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..
        }
    }
}
Risposto il 08/08/2009 a 14:49
fonte dall'utente

voti
3

Che ne dite di:

square.printBorder(N|E|W?0:10, N|S|W?0:10, N?0:10, N|E|S?10:0);
Risposto il 08/08/2009 a 14:53
fonte dall'utente

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