Domanda

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

Si può lavorare 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?

È stato utile?

Soluzione

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

Appena il mio parere. :)

Altri suggerimenti

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 printBorder condizionale con la funzione originale:

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

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

Per prima cosa 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 un'occhiata 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.

Come su:

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

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..
        }
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top