2009-10-23 16 views
33

डेटाफ्लोएनोमालीएलालिसिस: 'डीडी'-परिवर्तनीय 'चर' के लिए 'डीएम'-विसंगति ' (रेखाएं' एन 1 '-' एन 2 ')।इन पीएमडी नियमों का कारण क्या है?

डेटाफ्लोएनोमालीएलालिसिस: 'डीयू'-परिवर्तनीय 'चर' के लिए विसंगति ' (रेखाएं' एन 1 '-' एन 2 ')।

डीडी और डीयू परिचित परिचित ... मैं कमजोर पूर्व और पोस्ट स्थितियों से संबंधित परीक्षण और विश्लेषण जैसी चीजों में कहना चाहता हूं, लेकिन मुझे विशिष्टताओं को याद नहीं है।

NullAssignment: शून्य पर ऑब्जेक्ट असाइन करना एक कोड गंध है। रिफैक्टरिंग पर विचार करें।

की स्थापना नहीं चाहेंगे null को कोई चीज कचरा संग्रहण में सहायता, अगर वस्तु एक स्थानीय वस्तु (विधि के बाहर नहीं किया) है? या वह एक मिथक है?

MethodArgumentCouldBeFinal: पैरामीटर 'परम' निर्दिष्ट नहीं की जाती और हो सकता है घोषित अंतिम

LocalVariableCouldBeFinal: स्थानीय चर 'चर' अंतिम घोषित किया जा सकता

वहाँ के लिए किसी भी लाभ कर रहे हैं final पैरामीटर और चर का उपयोग कर?

LooseCoupling: तरह कार्यान्वयन प्रकार के प्रयोग से बचें 'LinkedList'; इंटरफ़ेस बजाय

का उपयोग करते हैं मुझे पता है कि मैं विशेष रूप से एक LinkedList की जरूरत है, यही कारण है कि मैं अपने इरादे स्पष्ट रूप से भविष्य डेवलपर्स के लिए स्पष्ट करना एक का उपयोग नहीं होगा? कक्षा को वापस करने की एक बात है जो क्लास पथ को उच्चतम बनाता है जो समझ में आता है, लेकिन मैं अपने चर को सख्त अर्थ के रूप में क्यों घोषित नहीं करूंगा?

AvoidSynchronizedAtMethodLevel: विधि स्तर तुल्यकालन

क्या फायदे ब्लॉक स्तर तुल्यकालन विधि स्तरीय तुल्यकालन से अधिक है उपयोग ब्लॉक स्तर के बजाय?

AvoidUsingShortType: कम प्रकार

मेरी पहली भाषाओं थे C और C++, लेकिन जावा दुनिया में, मैं क्यों नहीं प्रकार है कि अपने डेटा का सबसे अच्छा वर्णन का उपयोग करना चाहिए का उपयोग न करें?

उत्तर

33
  • डीडी और ड्यू विसंगतियों (अगर मैं सही ढंग से याद — मैं FindBugs का उपयोग करें और संदेशों कुछ भिन्न होते हैं), एक स्थानीय चर है कि कभी नहीं पढ़ने के लिए एक मूल्य बताए का उल्लेख आम तौर पर, क्योंकि यह पहले एक और मूल्य पर पुन: सौंपा है कभी पढ़ा जा रहा है। एक सामान्य मामला घोषित होने पर null के साथ कुछ चर प्रारंभ करना होगा। Don't declare the variable until it's needed.

  • कचरा कलेक्टर "सहायता" करने के लिए null को स्थानीय चर में असाइन करना एक मिथक है। पीएमडी आपको बता रहा है कि यह सिर्फ काउंटर-उत्पादक अव्यवस्था है।

  • स्थानीय चर पर अंतिम निर्दिष्ट करना एक अनुकूलक के लिए बहुत उपयोगी होना चाहिए, लेकिन मेरे पास इस संकेत का लाभ लेने वाले मौजूदा जेआईटी के कोई ठोस उदाहरण नहीं हैं। मैंने इसे अपने कोड की शुद्धता के बारे में तर्क में उपयोगी पाया है।

  • & hellip के संदर्भ में इंटरफेस निर्दिष्ट करना; अच्छा, इंटरफेस एक महान डिजाइन अभ्यास है। आप आसानी से कॉलर को प्रभावित किए बिना संग्रह के कार्यान्वयन को आसानी से बदल सकते हैं। इंटरफेस के बारे में यही सब कुछ है।

  • मैं, कई मामलों में जहां एक फोन करने वाले एक LinkedList की आवश्यकता होगी के बारे में सोच नहीं सकता है क्योंकि यह किसी भी एपीआई कि कुछ इंटरफेस द्वारा घोषित नहीं किया गया है का खुलासा नहीं करता। यदि ग्राहक उस एपीआई पर निर्भर करता है, तो यह सही इंटरफ़ेस के माध्यम से उपलब्ध है।

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

  • short के प्रकार के संचालन किसी भी परिचालन में int पर प्रचारित किए जाते हैं। यह नियम आपको यह बताने दे रहा है कि यह प्रचार हो रहा है, और आप int का भी उपयोग कर सकते हैं। हालांकि, short प्रकार का उपयोग स्मृति को सहेज सकता है, इसलिए यदि यह एक इंस्टेंस सदस्य है, तो शायद मैं उस नियम को अनदेखा कर दूंगा।

+0

प्रकार बाइट के संचालन किसी भी परिचालन में int को बढ़ावा दिया जाता है। –

+0

तो टाइप 'char' के संचालन हैं, लेकिन यह इस प्रश्न के लिए प्रासंगिक नहीं है। – erickson

3

DataflowAnomalyAnalysis: मिले 'के लिए DD'-विसंगति चर' चर ' (लाइनों' n1 '-' n2 ')।

डेटाफ्लोएनोमालीएलालिसिस: 'डीयू'-परिवर्तनीय 'चर' के लिए विसंगति ' (रेखाएं' एन 1 '-' एन 2 ')।

कोई विचार नहीं।

NullAssignment: शून्य पर ऑब्जेक्ट असाइन करना एक कोड गंध है। रिफैक्टरिंग पर विचार करें।

ऑब्जेक्ट को null पर कचरा संग्रह में सहायता नहीं करेगा, यदि वस्तु एक स्थानीय वस्तु है (विधि के बाहर उपयोग नहीं की जाती है)? या वह एक मिथक है?

स्थानीय तरीकों में ऑब्जेक्ट्स विधि लौटने के बाद एकत्रित कचरा के रूप में चिह्नित किए जाते हैं। उन्हें शून्य पर सेट करने से कोई फर्क नहीं पड़ता।

चूंकि इससे कम अनुभव डेवलपर्स कम हो जाएंगे, इसके बारे में उस शून्य कार्य को कोड गंध माना जा सकता है।

MethodArgumentCouldBeFinal: पैरामीटर 'परम' निर्दिष्ट नहीं की जाती और हो सकता है घोषित अंतिम

LocalVariableCouldBeFinal: स्थानीय चर 'चर' अंतिम घोषित किया जा सकता

उपयोग करने के लिए क्या कोई लाभ कर रहे हैं final पैरामीटर और चर?

यह स्पष्ट करता है कि वस्तु वस्तु के जीवन चक्र के दौरान मूल्य नहीं बदलेगा।

इसके अलावा, अगर किसी भी मौके पर कोई व्यक्ति मूल्य आवंटित करने का प्रयास करता है, तो संकलक इस कोडिंग त्रुटि को संकलित प्रकार पर रोक देगा।

इस पर विचार करें:

public void businessRule(SomeImportantArgument important) { 
     if(important.xyz()){ 
      doXyz(); 
     } 
     // some fuzzy logic here 
     important = new NotSoImportant(); 
     // add for/if's/while etc 

    if(important.abc()){ // <-- bug 
     burnTheHouse(); 
    } 
    } 

मान लीजिए कि आप कुछ रहस्यमय बग कि समय-समय पर घर जलता का समाधान करने के लिए आवंटित कर रहे हैं।

आपको पता है कि इस्तेमाल किया पैरामीटर या, क्या आप समझ में नहीं आता है क्योंburnTHeHouse विधि अगर स्थिति (अपने निष्कर्षों के अनुसार)

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

final का उपयोग इस तरह की चीजों को रोकने में मदद करता है।

LooseCoupling: तरह कार्यान्वयन प्रकार के प्रयोग से बचें 'LinkedList'; इंटरफ़ेस बजाय

का उपयोग करते हैं मुझे पता है कि मैं विशेष रूप से एक LinkedList की जरूरत है, यही कारण है कि मैं अपने इरादे स्पष्ट रूप से भविष्य डेवलपर्स के लिए स्पष्ट करना एक का उपयोग नहीं होगा? कक्षा को वापस करने की एक बात है जो क्लास पथ को उच्चतम बनाता है जो समझ में आता है, लेकिन मैं अपने चर को सख्त अर्थ के रूप में क्यों घोषित नहीं करूंगा?

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

आज, लिंक्डलिस्ट समझ में आ सकता है, लेकिन एक इंटरफेस का उपयोग करके आप अपने स्वयं को (या दूसरों) को आसानी से बदलने में मदद करते हैं।

छोटी, निजी परियोजनाओं के लिए यह बिल्कुल समझ में नहीं आता है, लेकिन चूंकि आप पहले से ही एक विश्लेषक का उपयोग कर रहे हैं, मुझे लगता है कि आप पहले से ही कोड की गुणवत्ता की परवाह करते हैं।

इसके अलावा, अच्छी आदतें बनाने के लिए कम अनुभवी डेवलपर की सहायता करता है। [मैं यह नहीं कह रहा हूँ आप एक कर रहे हैं, लेकिन क्या आप जानते हैं विश्लेषक नहीं है;)]

AvoidSynchronizedAtMethodLevel: उपयोग ब्लॉक स्तर बल्कि विधि स्तर से तुल्यकालन

क्या फायदे करता ब्लॉक स्तर तुल्यकालन विधि-स्तर सिंक्रनाइज़ेशन खत्म हो गया है?

सिंक्रनाइज़ अनुभाग को बेहतर छोटा। बस।

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

AvoidUsingShortType: कम प्रकार

मेरी पहली भाषाओं थे C और C++, लेकिन जावा दुनिया में, मैं क्यों नहीं प्रकार है कि अपने डेटा का सबसे अच्छा वर्णन का उपयोग करना चाहिए का उपयोग न करें?

मैंने कभी इसके बारे में नहीं सुना है, और मैं आपसे सहमत हूं :) मैंने कभी भी कम उपयोग नहीं किया है।

मेरा अनुमान है कि इसका उपयोग न करके, आप अपने स्वयं को int पर अपग्रेड करने में मदद करेंगे।

कोड गंध प्रदर्शन अनुकूलन की तुलना में कोड गुणवत्ता के लिए अधिक उन्मुख हैं। इसलिए कार्यक्रम की गति में सुधार के मुकाबले कम अनुभवी प्रोग्रामर के लिए सलाह दी जाती है और नुकसान से बचने के लिए सलाह दी जाती है।

इस तरह, आप बेहतर डिज़ाइन के लिए कोड बदलने की कोशिश करते समय बहुत समय और निराशा बचा सकते हैं।

यदि यह सलाह समझ में नहीं आती है, तो बस उन्हें अनदेखा करें, याद रखें, आप डेवलपर प्रभारी हैं, और टूल केवल एक उपकरण है। अगर कुछ गलत हो जाता है, तो आप उपकरण को दोष नहीं दे सकते, है ना?

0

AvoidUsingShortType: लघु प्रकार

  • सूची आइटम

    कम का प्रयोग न करें है 16 बिट, जावा में 2 की तारीफ

  • के बाहर पूर्णांक परिवार में कुछ भी साथ एक छोटी mathmatical operaion एक और शॉर्ट के लिए बड़े आकार में रनटाइम साइन एक्सटेंशन रूपांतरण की आवश्यकता होगी। एक फ्लोटिंग पॉइंट के खिलाफ संचालन के लिए साइन एक्सटेंशन और आईईईई -754 में एक गैर-तुच्छ रूपांतरण की आवश्यकता होती है।
  • सबूत नहीं मिल रहा है, लेकिन 32 बिट या 64 बिट रजिस्टर के साथ, अब आप बाइटकोड स्तर पर 'प्रोसेसर निर्देश' पर सहेज नहीं रहे हैं। जहां तक ​​प्रोसेसर रजिस्टर का संबंध है, आप अर्द्ध ट्रेलर के पार्किंग स्थल में एक कॉम्पैक्ट कार पार्किंग कर रहे हैं।
  • यदि आप बाइट कोड स्तर पर अपनी परियोजना को अनुकूलित कर रहे हैं, वाह। बस वाह। ; पी
  • मैं इस अपराधी चेतावनी को अनदेखा करने के डिजाइन पक्ष से सहमत हूं, केवल आपके ऑब्जेक्ट को सटीक रूप से वर्णित प्रदर्शन रूपांतरणों के विरुद्ध 'संक्षिप्त' के साथ वर्णित करना चाहता हूं।
  • मेरी राय में, प्रचलित प्रदर्शन हिट अधिकांश मशीनों पर कमजोर हैं। त्रुटि को अनदेखा करें।
1

अशक्त कचरा संग्रहण में सहायता के लिए एक वस्तु की स्थापना नहीं चाहेंगे, अगर वस्तु एक स्थानीय वस्तु है (विधि के बाहर नहीं किया)? या यह है कि मिथक?

एकमात्र चीज यह है कि ऑब्जेक्ट के लिए विधि के अंत से पहले जीसीडी होना संभव हो जाता है, जो शायद ही कभी आवश्यक है।

अंतिम पैरामीटर और चर का उपयोग करने के कोई फायदे हैं?

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

तो मुझे पता है कि मैं विशेष रूप से एक LinkedList की जरूरत है, कारण है कि मैं का उपयोग नहीं होता करने के लिए एक मेरे इरादों भविष्य डेवलपर्स के लिए स्पष्ट रूप से स्पष्ट कर दूं?

क्या आप किसी भी कारण से सोच सकते हैं कि आपको विशेष रूप से लिंक्डलिस्ट की आवश्यकता क्यों है?

यह एक बात वर्ग कि वर्ग रास्ता है कि समझ में आता है अप उच्चतम है वापसी है, लेकिन क्यों मैं अपने चर घोषित नहीं होता कठोरतम भावना के होने के लिए?

मैं स्थानीय चर या क्षेत्रों के बारे में ज्यादा परवाह नहीं है, लेकिन यदि आप प्रकार LinkedList की एक विधि पैरामीटर घोषित, मैं तुम्हें शिकार होगा और चोट आप, क्योंकि यह यह असंभव मुझे Arrays.asList() जैसी चीजों का उपयोग करने के लिए बनाता है और Collections.emptyList()

ब्लॉक-स्तरीय सिंक्रनाइज़ेशन के तरीके-स्तर सिंक्रनाइज़ेशन पर क्या फायदे हैं?

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

जावा दुनिया में

, मैं क्यों नहीं प्रकार है कि मेरी डेटा का सबसे अच्छा वर्णन इस्तेमाल करना चाहिए?

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

0

क्या फायदे ब्लॉक स्तर तुल्यकालन विधि स्तरीय तुल्यकालन से अधिक है? एक विधि सिंक्रनाइज़ करें synchronize(getClass()) ब्लॉक की तरह है, और सभी वर्गों को ब्लॉक करता है।

हो सकता है कि आपको लगता है कि

3

बस एक final प्रश्न पर टिप्पणी नहीं करना चाहते।

एक परिवर्तनीय परिणामों पर "अंतिम" डालने में केवल एक बार असाइन किया जा सकता है। इसका मतलब यह नहीं है कि लिखना आसान है, लेकिन इसका निश्चित रूप से मतलब है कि भविष्य में रखरखाव के लिए पढ़ना आसान है।

इन बिंदुओं पर विचार करें:

  • किसी भी चर एक final के साथ तुरंत में वर्गीकृत किया जा सकता "देखते समय मूल्य में परिवर्तन नहीं होगा"।
  • निहितार्थ से इसका मतलब है कि यदि सभी चर जो बदल नहीं जाएंगे तो अंतिम के साथ चिह्नित किया जाता है, तो चर के साथ चिह्नित नहीं किए गए वेरिएबल वास्तव में बदल जाएंगे।

इसका मतलब है कि आप पहले से ही देख सकते हैं जब परिभाषा भाग के माध्यम से पढ़ने जो चर, के लिए बाहर देखने के रूप में वे कोड के दौरान बदल सकते हैं, और देखभाल करने वाले उसकी/उसके प्रयासों बेहतर खर्च कर सकते हैं के रूप में कोड में अधिक है पठनीय।

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