2009-05-17 16 views
5

बस सोच रहा है कि निम्नलिखित को अच्छा प्रोग्रामिंग अभ्यास माना जाता है या नहीं? मैं अपनी व्यक्तिगत स्रोत फ़ाइलों को यथासंभव संक्षिप्त और अव्यवस्थित रखना चाहता हूं, लेकिन मुझे आश्चर्य है कि अधिक अनुभवी कोडर इसके बारे में क्या सोचेंगे। मैं विशेष रूप से सेटिंग्स.जावा वर्ग के विचार को एक ही स्थान पर अपने सभी "मैजिक नंबर" रखने के लिए पसंद करता हूं। क्या किसी के पास कोई सुझाव है कि मैं चीजों पर कैसे सुधार कर सकता हूं?जावा - क्या यह अच्छा प्रोग्रामिंग अभ्यास है?

मुबारक कोडिंग :-)

class ApplicationLauncher 
{ 
    public static void main(String[] args) 
    { 
     SwingApplication mySwingApplication = new SwingApplication(); 
    } 
} 

////////////// 

import javax.swing.*; 

public class SwingApplication extends JFrame 
{ 
    public SwingApplication() 
    {  
     JFrame myJFrame = new JFrame(); 
     myJFrame.setSize(Settings.frameWidth, Settings.frameHeight); 
     myJFrame.setVisible(true);  
    } 
} 

////////////// 

class Settings 
{ 
    static int frameWidth = 100; 
    static int frameHeight = 200; 
} 
+4

आप चार रिक्त स्थान से यह इंडेंट करके कोड स्वरूपित कर सकते हैं। यह कोड चुनकर और ctrl-k दबाकर स्वचालित किया जा सकता है। चीयर्स। – Stephan202

+0

धन्यवाद। मैं अभी भी इस साइट का काम करने के लिए उपयोग कर रहा हूं। मैं इस बात को ध्यान में रखूंगा कि आपने भविष्य के लिए क्या कहा है। –

उत्तर

6

सेटिंग कक्षा रखने में कुछ भी गलत नहीं है; हालांकि, आपके उदाहरण में सेटिंग वे किस फ्रेम पर लागू होती हैं, इस मामले में सेटिंग्स बल्कि अजीब हैं, न ही वे वास्तविक सेटिंग्स हैं, बल्कि डिफ़ॉल्ट मान जो स्विंग एप्प्लिकेशन क्लास में सख्ती से संबंधित हैं।

एक और बात जो हम ज्यादा नियंत्रण अपने हाथ में नहीं है कैसे इस कार्यक्रम का संदेश पंप लूप में स्विंग झरने में निर्माता कॉल।

मेरे लिए यह एक निर्माता है कि कभी नहीं देता है (जब तक फ्रेम बंद कर दिया है) और एक वस्तु को प्रारंभ की तुलना में अधिक होता है के साथ भावना बनाया कभी नहीं किया है।

5

जादू संख्या के साथ विशेष कक्षाएं होने के रूप में स्थिर सदस्यों को एक अच्छा जावा अभ्यास है।

कार्यक्रमों बढ़ने के रूप में, एकाधिक सेटिंग कक्षाएं, वर्णनात्मक नाम के साथ प्रत्येक, इस्तेमाल किया जा सकता।

3

मैकर ने इसे अच्छी तरह से कवर किया। इसके अलावा, इसे इस तरह से करने से आप भविष्य में कुछ सेटिंग्स को आसानी से वास्तविक उपयोगकर्ता वरीयताओं में स्थानांतरित कर सकते हैं ताकि वे प्रोग्राम के विभिन्न हिस्सों को अनुकूलित कर सकें। चूंकि आपकी सभी सेटिंग्स पहले से ही अपनी कक्षाओं में अलग हो चुकी हैं, इसलिए इसके लिए आपके हिस्से पर कम से कम प्रयास की आवश्यकता होगी।

4

समूह के लिए की तरह इस सामान के सभी कुछ, जादू संख्या आदि ... एक बड़ी और बदसूरत एक्सएमएल फ़ाइल में जो रनटाइम पर पढ़ा जाएगा (और की भावना बनाया)। आपका दृष्टिकोण स्पष्ट रूप से एक छोटे से परियोजना के लिए ठीक है (उदाहरण के लिए सामान्य पाठ्यक्रम), लेकिन एक XML फ़ाइल से इन सेटिंग होने का स्पष्ट लाभ के बारे में सोचना: आप अपनी सेटिंग्स :)

में किए गए परिवर्तनों को प्रतिबिंबित करने के लिए अपने स्रोत कोड पुनः संकलित की जरूरत नहीं होगी
+3

या गुण फ़ाइल – digitaljoel

2

मुझे लगता है कि जब तक सेटिंग बदलने की संभावना नहीं है तब तक यह एक अच्छा अभ्यास हो सकता है और आप सेटिंग्स के बीच संबंध दस्तावेज करते हैं। यदि इन्हें बदलने की संभावना है तो कॉन्फ़िगरेशन फ़ाइलें और/या कमांड लाइन तर्क अधिक समझ में आते हैं, क्योंकि उन्हें पुन: संकलन की आवश्यकता नहीं होती है।

4

आप उपयोग कर रहे हैं क्या कुछ लोगों को, कहते हैं "खतरनाक स्थिरांक इंटरफ़ेस antipattern" हालांकि आमतौर पर स्थिरांक एक अंतरफलक है कि आयात किया जाता है में हैं। मुझे इसके साथ कोई समस्या नहीं है, खासकर स्थैतिक आयात के आगमन के बाद से, लेकिन शायद कोई हमें भयानक बुराइयों पर भर देगा। उनमें से एक ऐसा लगता है कि "इंटरफेस के लिए यह नहीं है"।

//Schedule a job for the event-dispatching thread: creating 
    //and showing this application's GUI. 
    SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       JFrame myJFrame = new JFrame(); 
       myJFrame.setSize(Settings.frameWidth, Settings.frameHeight); 
       myJFrame.setVisible(true); 
      } 
     }); 
+2

एंटीपाटर एक इंटरफ़ेस को परिभाषित कर रहा था और फिर इसे आयात कर रहा था, इसे इस तरह एक स्थिर वर्ग के रूप में उपयोग नहीं कर रहा था। स्थैतिक आयात ने विशेष रूप से अनावश्यक दोनों को आयात और इंटरफ़ेस बनाया है, क्योंकि "इंटरफेस के लिए यह नहीं है"। –

1

परिवर्त्य स्टैटिक्स एक बहुत बुरा विचार कर रहे हैं:

अधिक चिंता का विषय

है कि आप एक सूत्र में अपने जीयूआई शुरू कर दिया जाना चाहिए। "ऊपर से पैरामीटर" के साथ चिपके रहें।

यह सीधे पूछा गया था, लेकिन उदाहरण कोड अन्य समस्या है। आप JFrame (एक बुरा व्यवहार) विस्तार किया है, लेकिन फिर कि नजरअंदाज कर दिया और बनाया एक और JFrame वास्तव में उपयोग करने के लिए। इसके अलावा, आप हमेशा AWT घटना डिस्पैच थ्रेड (EDT) पर घुमाओ घटकों का उपयोग करने की बॉयलरप्लेट शामिल करने के लिए की जरूरत है।

2

यदि आप अपने जादू संख्याओं के लिए statics का उपयोग करने जा रहे हैं, तो सुनिश्चित करें कि वे भी अंतिम हैं, यदि आप उनका मतलब बदलना नहीं चाहते हैं।

+0

सावधान रहें! यदि वे अंतिम हैं, तो संकलक मूल्यों को उस कोड में कॉपी करेगा जो उन्हें संदर्भित करता है (अनुकूलन के रूप में)। इसका अर्थ यह है कि यदि आप स्थिरांक के मानों को बदलते हैं, तो आपको उन सभी कोडों को पुन: संकलित करने की आवश्यकता है जो उन स्थिरांक का उपयोग करते हैं! (यह विशेष रूप से खराब है अगर स्थिरांक एक अलग जार में हैं) –

0

आप अपनी जीयूआई सेटिंग्स/लॉन्चिंग/गुणों से निपटने के लिए जेएसआर 2 9 6 (Swing Application Framework) में देखना चाहेंगे।

0

एक और समाधान, जिसमें स्थैतिक आयात की आवश्यकता नहीं है, फ़ील्ड, गेटर्स और सेटर्स के साथ एक पूर्ण "एप्लिकेशन सेटिंग्स" कक्षा बनाना होगा, और कक्षा के निर्माता को पैरामीटर की आवश्यकता वाले वर्ग के निर्माता को पास करना होगा। यह आपको एक कॉन्फ़िगरेशन ऑब्जेक्ट रखने की अनुमति देता है जिसे उपयोगकर्ता को विंडो का आकार बदलने पर नया आकार सहेजना है, तो आसानी से जारी या संशोधित किया जा सकता है।

4

के रूप में अन्य लोगों ने कहा, यह पूरी तरह से अच्छा अभ्यास है, लेकिन वहाँ कुछ चीजें आप कोड में सुधार करने के लिए कर सकते हैं:

  • Settings वर्ग के लिए एक निजी कोई तर्क निर्माता दीजिए। इससे तत्काल स्थिरता हो जाती है और इसके इरादे को स्थिरांक के भंडार के रूप में स्पष्ट किया जाता है।
  • सेटिंग्स final (अपरिवर्तनीय) के साथ-साथ static होना चाहिए।
  • आमतौर पर, जावा में स्थिरांक के बजाय LIKE_THIS लिखा गया है।
  • यदि आप जावा 1.5 या अधिक का उपयोग कर रहे हैं, तो आप Settings.FRAME_WIDTH लिखने के बजाय FRAME_WIDTH का उपयोग करने में सक्षम होने के लिए अपने कक्षाओं में import static Settings.FRAME_WIDTH; का उपयोग कर सकते हैं।

यह आप के साथ समाप्त होता है:

class Settings 
{ 
    /** Do not instantiate! */ 
    private Settings() {} 

    static final int FRAME_WIDTH = 100; 

    static final int FRAME_HEIGHT = 200; 
} 
+2

सावधान रहें! यदि वे अंतिम हैं, तो संकलक मूल्यों को उस कोड में कॉपी करेगा जो उन्हें संदर्भित करता है (अनुकूलन के रूप में)। इसका अर्थ यह है कि यदि आप स्थिरांक के मानों को बदलते हैं, तो आपको उन सभी कोडों को पुन: संकलित करने की आवश्यकता है जो उन स्थिरांक का उपयोग करते हैं! (यह विशेष रूप से खराब है अगर स्थिरांक एक अलग जार में हैं) –

+0

वाह, मुझे यह नहीं पता था, लेकिन यह कुछ चीजें बताता है जिन्हें मैंने नेटबीन पर पहले दोषी ठहराया था। मुझे अभी भी लगता है कि उन्हें स्वच्छता के लिए अंतिम बनाया जाना चाहिए। – Zarkonnen

संबंधित मुद्दे