कैसे इस कोड को बेहतर बनाने के लिए? (बहुत अधिक हो)

वोट
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

मैं भारतीय विदेश सेवा के बारे में परवाह नहीं होता। मैं तो बस इसे और अधिक पठनीय बनाने चाहते हैं:

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

सबसे पहले आप ठीक कर रहे हैं, यह वास्तव में यह क्या व्यक्त करता है, अंतरिक्ष कि आप प्रयोग कर रहे हैं, समाधान का सबसे यहाँ सिर्फ गंदा पानी के बारे में चिंता मत करो है।

क्या तुम सच में कुछ इस प्रकार दिखाई 'है' अगर आप वर्ग में सीमा पैरामीटर नहीं ले जा सकते हैं। आप राज्य जहां सीमा दिखाया जाना चाहिए (वर्ग में अपने उदाहरण में 10) सीमा गद्दी चला जाता, संभवतः भी, और फिर बस square.printBorders फोन ()। इस संदर्भ जहाँ आप इस का उपयोग कर रहे पर बहुत कुछ निर्भर करता है।

08/08/2009 को 14:14
का स्रोत उपयोगकर्ता

वोट
1

आप जो प्रोग्रामिंग भाषा निर्दिष्ट नहीं किया।

अगर यह जावा थे, 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