Πώς να βελτιώσει αυτόν τον κωδικό; (Πάρα πολλά αν)

ψήφοι
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);
  }
}

Μπορεί να δουλεύουν μια χαρά, αλλά νομίζω ότι δεν είναι τόσο κομψό, είναι πάρα πολλά, αν και όλοι δήλωση είναι περισσότερο ή λιγότερο το ίδιο. Νομίζω ότι πρέπει να υπάρχει έχουν έναν τρόπο να απλοποιήσει αυτή κωδικούς, οποιεσδήποτε προτάσεις;

Δημοσιεύθηκε 08/08/2009 στις 08:52
πηγή χρήστη
Σε άλλες γλώσσες...                            


6 απαντήσεις

ψήφοι
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);
}
Απαντήθηκε 08/08/2009 στις 09:00
πηγή χρήστη

ψήφοι
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);
}
Απαντήθηκε 08/08/2009 στις 09:03
πηγή χρήστη

ψήφοι
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);

Απλά η γνώμη μου. :)

Απαντήθηκε 08/08/2009 στις 09:26
πηγή χρήστη

ψήφοι
3

Πρώτα κάνετε εντάξει, αυτό κάνει ακριβώς αυτό που εκφράζει, μην ανησυχείτε για το χώρο που χρησιμοποιείτε, οι περισσότερες από τις λύσεις εδώ μόνο λάσπη το νερό.

Αν θέλετε πραγματικά να «κάνει» κάτι εξετάσουμε αν δεν μπορείτε να μετακινήσετε την παράμετρο των συνόρων στην πλατεία. μπορείτε να μετακινήσετε τα σύνορα padding (10 στο παράδειγμά σας στην πλατεία), ενδεχομένως και το μέλος που θα πρέπει να εμφανίζονται στα σύνορα, και στη συνέχεια απλά καλέστε square.printBorders (). Αυτό εξαρτάται πολύ από το πλαίσιο στο οποίο θα χρησιμοποιείτε αυτό.

Απαντήθηκε 08/08/2009 στις 14:14
πηγή χρήστη

ψήφοι
1

δεν διευκρίνισε ποια γλώσσα προγραμματισμού.

αν ήταν java, enums μπορεί να προσφέρει καλό αναγνώσιμη σύνταξη, την ασφάλεια του τύπου, καθώς και να επωφεληθούν από τις δυνατότητες αποδοτικής λίγο-κόλπα της εφαρμογής EnumSet.

Εναλλακτικά, θα μπορούσατε επίσης να παρέχει μια μέθοδο varargs υπογραφή, αλλά τότε δεν μπορείτε να είστε σίγουροι ότι η μέθοδος θα κληθεί με printBorder (Ν, Ν), η οποία δεν έχει νόημα. χρησιμοποιώντας το περιβάλλον 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..
        }
    }
}
Απαντήθηκε 08/08/2009 στις 14:49
πηγή χρήστη

ψήφοι
3

Τι λέτε για:

square.printBorder(N|E|W?0:10, N|S|W?0:10, N?0:10, N|E|S?10:0);
Απαντήθηκε 08/08/2009 στις 14:53
πηγή χρήστη

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