2012-03-29 23 views
6

क्या यह मेरे लिए मूर्खतापूर्ण ब्रेक स्टेटमेंट छोड़ने के लिए मूर्ख है जो किसी भी तरह से अपवाद फेंकता है? तर्कसंगत हिस्सा उस घटना में वहां छोड़ना चाहता है जब तर्क बदल जाता है। मेरे एक और भाग नहीं चाहते हैं कि अन्य डेवलपर्स मेरे कोड पर संकलक चेतावनियां देख रहे हों ("पहुंचने योग्य कोड")।क्या मुझे एक ऐसे मामले में पहुंचने योग्य ब्रेक छोड़ना चाहिए जहां मैंने अपवाद फेंका?

switch (someInt) 
{ 
    case 1: 
     // Do something 
     break; 
    case 2: 
     // Do something else 
     break; 
    case 3: 
     // Oh, we don't use threes here! 
     throw new Exception("Business rules say don't use 3 anymore"); 
     break; // Unreachable...until the fickle business rules change... 
    default: 
     throw new Exception("Some default exception"); 
     break; // Unreachable...until...well, you get the idea. 
} 

क्या करना है?

अद्यतन

मैं कुछ प्रतिक्रियाओं कह रही है कि एक बाद की तारीख में फेंक निकालते हुए एक संकलक त्रुटि उत्पन्न होगी देखते हैं। हालांकि, ब्रेक के बिना फेंकने (या टिप्पणी) को हटाने के बाद यह मामलों को ढेर कर देगा, जो अनपेक्षित व्यवहार हो सकता है। मैं यह नहीं कह रहा कि यह एक संभावित परिदृश्य है, लेकिन ... अच्छी तरह से, केवल संभावित परिदृश्यों का मुकाबला करने के बारे में रक्षात्मक प्रोग्रामिंग है?

+1

'ब्रेक' की अब आवश्यकता नहीं है, मैं उन्हें हटा देता हूं क्योंकि मैं त्रुटियों के रूप में चेतावनियों के साथ निर्माण करता हूं। – asawyer

+1

दिलचस्प सवाल - मेरी प्रारंभिक प्रतिक्रिया ब्रेक स्टेटमेंट को शामिल करना होगा, लेकिन मुझे लगता है कि पूरी तरह से आदत के लिए नीचे रहना होगा। – KazR

+1

प्रगामा चेतावनी अक्षम अगर आपको लगता है कि आपकी चिंता वैध है लेकिन दूसरों को असुविधाजनक नहीं करना चाहते हैं, लेकिन अत्यधिक रक्षात्मक होने से आपके कोड बेस – Michael

उत्तर

6

मैं डी उन्हें हटा दें। कई कारणों से:

  • आप उन्हें पल
  • चेतावनी के बहुत सारे देखकर पर की जरूरत नहीं है मुझे हमेशा परेशान के रूप में आप इस प्रकार के शोर चेतावनी से आने वाले असली चेतावनी खो सकते हैं बनाता है (यह मानते हुए आप त्रुटि के रूप में सावधान भी करती हैं बंद)।
+0

आप "असली त्रुटियों" को कैसे याद करेंगे? या तो आपका कोड संकलित नहीं होगा या आप पहले से ही तय कर चुके हैं कि एक चेतावनी एक "वास्तविक त्रुटि" नहीं है (यानी आप "चेतावनियों के रूप में चेतावनियों के रूप में व्यवहार" ध्वज के साथ निर्माण नहीं करते हैं)। – Michael

+1

यदि आपके ऊपर उत्पन्न 150 चेतावनी मिली हैं जो शोर हैं और आप ऐसा कुछ पेश करते हैं जो उपयोगी चेतावनी उत्पन्न करता है, तो इसे याद करना आसान होगा। – gbanfill

0

तर्क परिवर्तनों की स्थिति में मुझे रक्षात्मक हिस्सा वहां छोड़ना चाहता है।

क्या तर्क वास्तव में यहां बदलने के अधीन है? क्या होता है जब एक अपवाद फेंक दिया जाता है तो बहुत अच्छी तरह से प्रलेखित किया जाता है। और मुझे लगता है कि आप उचित रूप से सुनिश्चित कर सकते हैं कि सी # के बाद के किसी भी संशोधन में "अब तक लिखे गए सभी कार्यक्रम" काम नहीं कर रहे हैं।

भले ही कोई कंपाइलर चेतावनी न हो, फिर भी अनावश्यक कोड एक अच्छी बात नहीं है जब तक कि नियमित रखरखाव के दौरान बग को रोककर कोड में खेलना न हो, इस मामले में हम उचित रूप से ऐसा नहीं कह सकते कि ऐसी संभावना मौजूद।

+0

को जल्दी से अव्यवस्थित कर सकता है तो मुझे लगता है कि उसका मतलब है कि अपवाद हटा दिया गया है, लेकिन फिर भी यह कोई समस्या नहीं है क्योंकि आपके पास एक या दूसरे होना है। –

+0

शायद मैंने गलत शब्दावली का उपयोग किया था, लेकिन नहीं, मेरा मतलब यह नहीं है कि सी # विनिर्देश बदलता है, केवल व्यवसाय नियमों को झुकाएं। –

0

तर्क का परिवर्तन उस स्थिति में छोड़ना चाहता है जब तर्क बदलता है।

ठीक है, आप throw को हटाने और एक break संकलक जोड़ने के लिए आपको बता दूँगी भूल जाते हैं।

मैं के लिए ब्रेक वहाँ कोई कारण नहीं देखते हैं। यह अनावश्यक है और आप अभी भी एक चेतावनी ट्रिगर करेंगे, इसलिए मैं इसे हटा दूंगा। आपके तर्क को अव्यवस्थित करने के लिए बेकार कोड छोड़ने का कोई अच्छा कारण नहीं है।

+2

बस ब्रेक w/o ब्रेक को हटाने से मामलों को ढेर कर दिया जाएगा, जो अनपेक्षित व्यवहार हो सकता है। –

+0

@ टिमलेनर: यह सच है क्योंकि शरीर खाली होगा। उसने कहा ... यदि आपने शरीर को खाली छोड़ दिया तो मुझे लगता है कि आपने ऐसा कारण किया है। मुझे आशा है कि आप अपने सहकर्मियों पर भरोसा कर सकते हैं कि स्विच कैसे काम करता है, इसकी मूल बातें जान सकें। –

+0

क्या हम सभी एक ही चीजों के लिए आशा नहीं करते हैं, वास्तव में? :) –

1

मैं इसे हटा दूंगा।

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

+0

सिर्फ एक चेतावनी नहीं, यह एक त्रुटि होगी। –

+0

@ एडीएस।, आप सही हैं, मेरी गलती। – Brandon

+0

असल में ऐसा कोई मामला है जहां हम दोनों गलत हैं। अगर अपवाद हटा दिया गया है और कुछ भी नहीं जोड़ा गया है तो शरीर खाली होगा और चेतावनी या त्रुटि के बिना गिरने की अनुमति देगा। –

2

कुछ कंपाइलर चेतावनियों को अनदेखा करके आप किसी भी कंपाइलर चेतावनी को अनदेखा करने के बुरे व्यवहार को मजबूत कर रहे हैं। मेरी राय में, यह break बयान छोड़ने से प्राप्त होने वाले किसी भी लाभ से अधिक जोखिम है।

संपादित करें: मैं संकलक आप अगर throw बयान हटा दिया जाना चाहिए थे में वापस break बयान डाल करने के लिए मजबूर कर के बारे में अपने मूल बिंदु हटा दिया। जैसा कि पेरो ने बताया, कुछ मामलों में, कंपाइलर नहीं होगा। यह सिर्फ मामले के नीचे एक के साथ गठबंधन करेगा।

+0

कंपाइलर आपको ब्रेक जोड़ने के लिए मजबूर नहीं करता है अगर मामले में कोई अन्य कोड नहीं है (फेंकने के बाद)। – payo

+0

आप सही हैं। उस स्थिति में, अच्छा कोड लिखने के लिए प्रोग्रामर पर ऑनस है। – FishBasketGordo

2

व्यक्तिगत रूप से, मैं कभी भी उत्पादन कोड में पहुंचने योग्य कोड नहीं छोड़ूंगा। परीक्षण के लिए यह ठीक है, लेकिन इसे इस तरह से मत छोड़ो।

आप कभी ऐसा नहीं करेंगे?

public void MyMethodThatThrows() 
{ 
    throw new Exception(); 
    return; // unneeded 
} 

तो break क्यों रखें?

+0

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

+0

@TimLehner, हा, अच्छा बिंदु। मेरा उदाहरण मूल रूप से इस मुद्दे को अतिरंजित करने के लिए था। –

7

मैं इसे switch में "छुपा" नहीं दूंगा। मैं जितनी जल्दी हो सके ArgumentExceptions फेंक दूंगा। इससे साइड इफेक्ट्स से बचा जाता है और यह भी अधिक पारदर्शी है।

किसी ने कुछ बिंदु जो someInt का उपयोग करता है, हालांकि यह 3.

उदाहरण के लिए है पर स्विच से पहले कोड जोड़ सकते हैं:

public void SomeMethod(int someInt) 
{ 
    if (someInt == 3) 
     throw new ArgumentException("someInt must not be 3", "someInt"); 

    switch (someInt) 
    { 
     // ... 
    } 
} 
+1

उत्कृष्ट बिंदु और एक महान कोड गंध। –

0

काश अपने प्रोजेक्ट स्रोतों इतना शांत और मुसीबत से कम थे, कि मुझे रक्षात्मक प्रोग्रामिंग के ऐसे मामूली मामलों के बारे में सोचना होगा :)

मेरा मतलब है कि सॉफ़्टवेयर-डेवलपमेंट - COM और इंटरऑप, सुरक्षा/अनुमतियां और औथ, प्रमाणपत्र, में बहुत से नुकसान हैं ... gosh , आपको कैसे नहीं बता सकता है पैर में शूटिंग से खुद को बचाने के लिए मुझे लिखना होगा।

बस इस ब्रेक को हटा दें, क्योंकि यह अनावश्यक है, यह उन लोगों के लिए भ्रमित है जो जानता है कि 'केस' break या return के साथ समाप्त होना चाहिए और उन फेलो के लिए स्पष्ट होना चाहिए जो इसे नहीं जानते हैं।

+0

सच है, यह जीवन में किसी की भी सबसे बड़ी समस्या नहीं है। अब, वापसी में समाप्त होने वाला मामला निश्चित रूप से बहस के लिए है ... –

0

MSDN C# Reference कहता है: "प्रत्येक ब्लॉक ब्लॉक के बाद एक ब्रेक स्टेटमेंट की आवश्यकता होती है, जिसमें अंतिम ब्लॉक भी शामिल है चाहे वह केस स्टेटमेंट या डिफ़ॉल्ट कथन है।"

तो, "फेंकने" को "जंप स्टेटमेंट" नहीं बनाया गया है? मुझे लगता है कि यह करता है। इस प्रकार, "ब्रेक" की आवश्यकता नहीं है, और "पहुंचने योग्य" समस्या दूर हो जाती है। :)

+0

ओपी ने स्वीकार किया कि 'ब्रेक आवश्यक नहीं है, लेकिन उन्हें रक्षात्मक रूप से छोड़ने पर विचार कर रहा है। गौर करें कि क्या होता है यदि आप अपवाद फेंकने के अलावा कुछ और करने का फैसला करते हैं। – jerry

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