2009-09-17 18 views
7

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

हालांकि, कई तकनीकों से बचने के लिए इस तकनीक को नियोजित करने पर क्या विचार है? मैं पहली बार पसंद करते हैं, के रूप में यह अधिक साफ लग रहा है

if (a instanceof Foo) { 
    // Cast once and assign to local variable. 
    Foo foo = (Foo)a; 

    if (foo.getB() == 1 && foo.getC() == 2) { 
    ... 
    } 
} 

या

if (a instanceof Foo) { 
    // Cast twice making code compact but possibly less readable. 
    // Also, is there an overhead in multiple casts? 
    if (((Foo)a).getB() == 1 && ((Foo)a).getC() == 2) { 
    ... 
    } 
} 

उत्तर

12

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

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

3

: इस समय मैं के बीच एक विकल्प के साथ सामना कर रहा हूँ। दूसरा Lisp जैसा दिखना शुरू हो रहा है। लेकिन यह सिर्फ एक व्यक्तिगत राय है।

+0

लिस्प के साथ क्या गलत है? –

+2

कुछ भी नहीं, मुझे लिस्प पसंद है, यह बहुत सारे ब्रांड्स के साथ होता है, बस इतना ही। –

19

मैं पठनीयता समस्याओं के कारण हमेशा कास्टिंग करने के बजाए स्थानीय चर बनाना पसंद करता हूं। कोड पठनीयता, मेरे लिए (या एक ही कोड पर काम कर रहे अन्य डेवलपर्स), एक महत्वपूर्ण मुद्दा है।

इस चरण में प्रदर्शन के बारे में चिंता करने से मुझे "समयपूर्व अनुकूलन" पैटर्न का एक उदाहरण माना जाता है।

+0

धन्यवाद - यह वास्तव में पहले से ही मेरा पसंदीदा दृष्टिकोण है; मैं सिर्फ प्रोग्रामर समुदाय से कुछ सत्यापन चाहता था। – Adamski

1

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

3

मैं कहूंगा कि महत्वपूर्ण बात समय से पहले अनुकूलित नहीं है। यदि कास्टिंग करने के लिए एक ओवरहेड है, तो यह इतना छोटा होने की संभावना है कि यह अभ्यास में प्रभावी ढंग से अनजान होगा। जब तक इस कोड स्निपेट ने आपके अधिकांश एप्लिकेशन के CPU समय का गठन नहीं किया, मुझे नहीं लगता कि आप दोनों के बीच कोई मापनीय प्रदर्शन अंतर देखेंगे।

नतीजतन मैं पहले विकल्प के लिए भी जाना चाहूंगा क्योंकि यह क्लीनर दिखता है और समझना और संशोधित करना आसान है - 99.99% परिस्थितियों में कुछ घड़ी चक्रों को तेजी से निष्पादित करने से कहीं अधिक महत्वपूर्ण है।

1

मैं दो कारणों से

  1. आवश्यक parantheses कोड cludgy बनाने के लिए और
  2. संभवतः डाली
0

मैं में एक (छोटे) भूमि के ऊपर नहीं है पढ़ने के लिए मुश्किल के लिए पहला विकल्प पसंद करते हैं, केवल कोड पठनीयता के लिए नहीं, बल्कि रनटाइम डीबगिंग खातिर (मूल उदाहरण के लिए - यदि आप स्थानीय में गेटर का नतीजा डालते हैं, तो आप पहली बार गेटटर में ट्रेस करने के बजाय उस मूल्य को देखते हैं) ।

0

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

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