2008-11-30 12 views
8

मुझे अपने कुछ विचार दें जिन पर एक बेहतर कोडिंग अभ्यास है/अधिक कुशल कोड/दिखता है सुंदर/जो कुछ भी: यदि संभावित समस्याओं का अनुमान लगाने और पकड़ने के लिए कथन का उपयोग करने की आपकी क्षमता में वृद्धि और सुधार करना है? या सामान्य रूप से कोशिश/पकड़ का अच्छा उपयोग कर रहे हैं?'if' कथन या 'try/catch' ब्लॉक का पूर्ण उपयोग?

मान लें कि यह जावा के लिए है (यदि यह मायने रखता है)।

संपादित करें: मैं इस समय अपने आप को कुछ वैसे बाहर दिनांकित और विवश वर्तमान कोडिंग प्रथाओं से दूर संक्रमण हूँ, लेकिन मैं एक छोटे से कुछ बिंदुओं (इस जैसे) पर ऐसा करने की आवश्यकता पर फटे हूँ। मैं बस इस पर कुछ दृष्टिकोण मांग रहा हूँ। बहस नहीं

उत्तर

1

मेरे 2p:

  • इसे अन्य कोडर कि आप अपवाद
  • संकलक से निपटने कर रहे हैं करने के लिए बिल्कुल स्पष्ट समझता है तुम क्या कर रहे हैं और अधिक उपयुक्त संकलन प्रदर्शन कर सकते हैं बनाता है: ट्राई/कैच का उपयोग सबसे अच्छा है आपके लिए समय-समय पर चेक

मेरे अनुभव में, यदि सशर्त-तर्क का उपयोग करके व्यापार तर्क से त्रुटि प्रबंधन को अलग करना मुश्किल हो जाता है।

+0

"त्रुटि हैंडलिंग" और "अपवाद हैंडलिंग" एक ही चीज़ नहीं हैं। – ThunderGr

4

if ब्लॉक थोड़ा तेज़ हैं; यदि आपको उनमें से एक दर्जन की आवश्यकता नहीं है, तो वे try/catches से बेहतर विचार हैं। अपवाद असाधारण होना चाहिए, हर बार जब कोड चलता है। मैं दुर्लभ घटनाओं जैसे सर्वर डिस्कनेक्शन (भले ही वे हर बार कुछ बार होते हैं) के लिए अपवादों का उपयोग करते हैं, और if मेरे किसी भी नियंत्रणीय चर के लिए ब्लॉक।

+1

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

2

मुझे लगता है कि अगर बयान बेहतर हैं। आप कोशिश कीजिए..कैच के साथ कोड की हर पंक्ति को घेर नहीं सकते (अच्छी तरह से आप कर सकते हैं लेकिन आपको यह नहीं करना चाहिए)। आप पकड़ने की कोशिश के साथ कोड के ब्लॉक को घेर सकते हैं लेकिन हर पंक्ति नहीं।

और अपवाद धीमे चीजें नीचे।

+2

अपवाद केवल वास्तविक रूप से फेंकने पर चीजों को धीमा करते हैं। इसलिए जब तक आप सुनिश्चित करते हैं कि उन्हें केवल असाधारण परिस्थितियों में फेंक दिया जाता है (जहां आमतौर पर प्रदर्शन विफल रहता है क्योंकि आप असफल होने जा रहे हैं), यह कोई चिंता नहीं है। –

+0

@ स्टेव जेसॉप यदि कोई कथन/पकड़ एक कथन से धीमा है, तो अपवादों को धीमा नहीं किया जाता है, भले ही फेंक दिया न जाए (बयानों की तुलना में)। आखिर में, कम से कम एक कोशिश/पकड़ ब्लॉक, यह जांचना है कि कोड के इस हिस्से में अपवाद फेंक दिया गया था या नहीं। – ThunderGr

+1

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

3

चाहे आप कौन सी कोड लिख रहे हों, आप दोनों का उपयोग कर समाप्त हो जाएंगे। मैं जावा रनटाइम के लिए बात नहीं कर सकता, लेकिन .NET रनटाइम पर ट्राइक-कैच ब्लॉक के उपयोग से जुड़े एक प्रदर्शन हिट है। नतीजतन, मैं उन्हें केवल उन क्षेत्रों में उपयोग करने का प्रयास करता हूं जहां एक बार पकड़े गए अपवाद को संभालने का एक स्पष्ट तरीका है (भले ही यह किसी समस्या के अस्तित्व को लॉग कर रहा हो)।

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

1

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

मुझे व्यक्तिगत रूप से परवाह नहीं है।

मुझे इस तथ्य से अवगत है कि एक प्रयास/पकड़ धीमा है और प्रदर्शन का कारण बनता है, लेकिन अगर मैं ऐसा करने के लिए एक दर्जन आईएफएस का उपयोग करने जा रहा हूं, तो मैं हमेशा ऐसा कर सकता हूं जो मैं करना चाहता हूं, मैं हमेशा कोड की रेखाओं की संख्या को बचाने के लिए प्रयास/पकड़ का उपयोग करें।

यह मेरे जीवन को किसी भी चीज़ को प्रमाणित करने के लिए इतना आसान बनाता है और अगर कथन विफल हो जाता है, तो बस मेरे 'कैच' ब्लॉक में मैंने अपने 'अन्य' ब्लॉक में क्या किया होगा।

कभी-कभी, अगर मैं कोशिश/पकड़ में बयान देता हूं, लेकिन वैसे भी, मैं स्पष्ट रूप से कुछ संलग्न करता हूं।

मैं ऐसा करता हूं जब मुझे ऐसा करने से पहले (1 या 2) मान्य करने के लिए केवल कुछ छोटी चीजें होती हैं।

+0

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

0

एक बात है जिसका उल्लेख यहां नहीं किया गया है।

एक और-कथन के साथ, हर बार कोड चलाता है, कम से कम 1 शर्त को निष्पादित मूल्यांकन की गारंटी दी जाती है। मुझे यकीन है कि हम सभी जानते हैं कि एक if-else-elseif काम करता है, लेकिन स्पष्ट होने के लिए ... यदि कथन का हिस्सा हमेशा मूल्यांकन किया जाएगा, यदि यह गलत है तो निम्नलिखित अन्य- यदि का मूल्यांकन किया गया है, और तब तक केवल अन्य का मूल्यांकन करने के लिए छोड़ दिया गया है।

तो यदि कोई अन्य कथन का उपयोग करके आपके प्रदर्शन पर असर पड़ेगा। महत्वपूर्ण नहीं है (ज्यादातर मामलों में), लेकिन यह मूल्यांकन करने के लिए CPU समय लेता है।

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

इसके अलावा, यह पकड़ नहीं है जो प्रदर्शन हिट का कारण बनता है, लेकिन फेंक देता है।

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

यदि आप जानते हैं कि उनके साथ क्या करना है, तो अपवाद अपवाद आवश्यक है। यदि आपके पास अपवाद को सही तरीके से संभालने का कोई तरीका नहीं है तो आपको इसे जाने देना चाहिए, क्योंकि कुछ कोड आगे बढ़ने के लिए श्रृंखला को संभालने का बेहतर तरीका हो सकता है।

उपयोगकर्ता द्वारा देखा जाने से पहले अपवादों को पकड़ने के लिए आपके आवेदन के पूर्ण शीर्ष स्तर पर अपवाद हैंडर होने का आमतौर पर एक अच्छा विचार है। एएसपी.नेट में आप इसे global.asax के Application_Error ईवेंट में कर सकते हैं। अन्य भाषाओं/वातावरण में आप अपने मुख्य पाश में ऐसा करेंगे, जो कुछ भी हो सकता है।

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

+0

आप कैसे कह सकते हैं कि एक प्रयास/पकड़ * रनटाइम पर तब तक नहीं माना जाता जब तक कि आवश्यक न हो *? यह किसी प्रकार के प्रोग्रामिंग जादू की तरह लगता है। कोड जैसी कोई चीज नहीं है जिसे * आवश्यक * तक नहीं माना जाता है। आपको कम से कम * जांच की आवश्यकता है कि क्या इसकी आवश्यकता है या नहीं। – ThunderGr

+0

मेरी टिप्पणी के लिए स्टीव का उत्तर, एक उचित स्पष्टीकरण प्रदान करता है कि एक अपवाद होने तक प्रयास/पकड़ ब्लॉक पर विचार क्यों नहीं किया जाएगा।इसे चलाने के लिए वर्चुअल मशीन की आवश्यकता होती है, हालांकि ऐसा लगता है कि भाषाओं के * रनटाइम्स * इस वर्चुअल मशीन को प्रदान करते हैं। मुझे संदेह है कि सीपीयू आर्किटेक्चर के अपवादों के लिए कोई समर्थन है। क्या यह? – ThunderGr

+0

@ थंडरग्रा मैं सभी भाषाओं के लिए बात नहीं कर सकता लेकिन माइकिग कम से कम सही है कि सी ++ अपवादों को कैसे संभालता है। सी ++ में ब्लॉक के पकड़ भाग को अनदेखा किया जाता है जब तक कि एक अपवाद फेंक दिया जाता है और ढेर खोलने लगते हैं। जैसे ही ढेर खुलता है, कोड अवांछित प्रक्रिया को रोकने के लिए कैच ब्लॉक की तलाश करता है। यदि कोई भी नहीं पाया जाता है जो अपवाद को छोड़ने में सक्षम है। कार्यक्रम निकलता है। –

0

@PersonalPerson - क्षमा करें, लेकिन यह सिर्फ आलसी कोडिंग है। कोशिश-पकड़ का उपयोग करने के बजाय, अगर बयान में बहुत अधिक हैं, तो अपने कोड को दोबारा क्यों न दें (यानी अपना सत्यापन तर्क अपनी विधि में रखें)। यह आपके कोड क्लीनर और अधिक पठनीय रखेगा और प्रदर्शन के लिए सर्वोत्तम प्रथाओं को बनाए रखेगा।

कम से कम # लाइनों को प्राप्त करने के लिए कभी भी अपना कोड लिखने का प्रयास न करें। यह हमेशा बुरी तरह खत्म हो जाएगा। निश्चित रूप से आप कुछ लिखने का एक और शानदार तरीका ढूंढ सकते हैं जो आपके कोडर-दोस्त ओह और आह पर होंगे, लेकिन यह चीजों को कम पठनीय बनाता है।

मैं कसम खाता हूं, मैंने आपके कोड के साथ पहले काम किया है, और यह मेरे सिर को चोट पहुंचाता है।

+0

दुर्भाग्य से यह कथन वास्तव में भाषा पर निर्भर करता है। कुछ भाषाओं में यदि 6 या 10+ परीक्षणों के साथ कई परीक्षणों के साथ एक कथन है, तो यदि कथन कथन को 90%% कहा जाएगा, तो कोड को अनुकूलित करने के तरीके के आधार पर बहुत सारे प्रोसेसर समय ले सकते हैं। इस मामले में एक कोशिश पकड़ ब्लॉक का उपयोग प्रोसेसर और अन्य कोडर दोनों को बताएगा यह वह कोड है जिसे मैं अधिकतर समय चलाना चाहता हूं जो भाषा के आधार पर संभावित गति को बढ़ा सकता है। किसी भी अन्य मामले में, मैं आपके साथ सहमत हूं, जब तक कि आप एक बतख टाइप की गई भाषा जैसे पायथन का उपयोग न करें। –

0

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

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

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

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