2010-05-20 16 views
10

मैंने हमेशा तर्क का पालन किया है: यदि जोर विफल रहता है, तो एक बग है। मूल कारण या तो हो सकता है:यदि दावा विफल रहता है, तो क्या कोई बग है?

  • जोर ही अमान्य (बग) (बग)
  • (कोई अन्य विकल्प)

अर्थात

  • एक प्रोग्रामिंग त्रुटि है है क्या कोई अन्य निष्कर्ष आ सकता है? क्या ऐसे मामले हैं जहां एक जोर विफल हो जाएगा और कोई बग नहीं है?

  • +5

    आपके पास 1,337 प्रतिष्ठा है। वह लीट है। –

    +0

    अब कोई चला गया और इसे बर्बाद कर दिया! (जब भी मैंने 1337 प्रतिनिधि मारा था तब भी मेरे पास एक स्क्रीनशॉट है: पी) – Thorarin

    +1

    एक चीज़ जो मैंने बहुत सी देखी है, यह कह रही है कि कुछ इनपुट स्थिति "मान्य" है, उदा। जो फ़ाइल पढ़ी जा रही है वह सही हैडर है। हालांकि यह एक "खराब" जोर है, क्योंकि यह अपेक्षा की जाती है कि फ़ाइल फर्जी है, लेकिन फ़ाइल प्रोग्रामिंग नियंत्रण में नहीं है। यह जोर दे रहा है कि उपयोगकर्ता स्पेसबार के बजाय एंटर कुंजी दबाता है। त्रुटि की रिपोर्ट करें, लेकिन एक जोर का उपयोग न करें। –

    उत्तर

    5

    हां, कोड में एक बग है।

    Code Complete

    दावे की स्थिति है कि पाए जाते हैं कभी नहीं करना चाहिए के लिए जाँच करें। [...] एक अभिकथन विषम हालत के लिए निकाल दिया जाता है

    हैं, सुधारात्मक कार्रवाई केवल एक त्रुटि gracefully- सुधारात्मक कार्रवाई है कार्यक्रम के स्रोत कोड, recompile बदलने के लिए संभाल करने के लिए नहीं है, और सॉफ्टवेयर के एक नए संस्करण जारी करें।

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

    2

    केवल अगर दावा चेतावनी स्थिति दिखाने के लिए था - इस मामले में एक विशेष वर्ग का दावा किया जाना चाहिए था।

    तो, जैसा कि आप सुझाव देते हैं, किसी भी जोर से एक बग दिखाना चाहिए।

    +0

    चेतावनियों के रूप में दावाों का उपयोग करना एक त्रुटि है और "assert" शब्द का अर्थ गलतफहमी दर्शाता है। –

    +0

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

    3

    यह एक अच्छा सवाल है।

    मेरी भावना है, अगर आपके कोड के कारण जोर विफल हो जाता है, तो यह एक बग है। दावा आपके कोड का अपेक्षित व्यवहार/परिणाम है, इसलिए एक दावा विफलता आपके कोड की विफलता होगी।

    6

    यदि दावा विफल रहता है तो कॉलर या कैली में कोई बग है। और कोई दावा क्यों होगा?

    +0

    और क्यों? मुझे नहीं पता, यही कारण है कि मैंने पूछा। मैं नियमित रूप से डेवलपर्स के खिलाफ बग दर्ज करता हूं ताकि वे दावा कर सकें कि वे "डिज़ाइन द्वारा" हैं। बस यह सुनिश्चित करना चाहता था कि वे गलत हैं/मैं उसी पृष्ठ पर हूं जैसे एस/डब्ल्यू दुनिया :) – noctonura

    +3

    यदि यह असफल होने की उम्मीद है, तो यह वास्तव में किसी दावे की आवश्यकता को पूरा नहीं करता है। जब आप कहते हैं, "मैं जोर देता हूं कि यह सच है," आप यह नहीं कह रहे हैं कि यह कभी-कभी या आमतौर पर सच है, आप कह रहे हैं कि यह हमेशा * सत्य है। –

    +0

    यह एक अशिष्ट सवाल था। एक जोर एक उम्मीद है। 'जोर दें (एक्स == 5)' मतलब है, "मुझे लगता है कि एक्स यहाँ 5 होगा"। हालांकि, यह निम्न स्तर के कोड में कुछ हद तक दुर्व्यवहार किया गया है, उदाहरण के लिए, कुछ लोग कहते हैं कि आप _must_ केवल एपीआई का उपयोग एक निश्चित तरीके से करते हैं या _undefined behaviour_ परिणाम देगा, और फिर कभी-कभी वे अमान्य इनपुट के खिलाफ जांच को लागू करने के लिए दावे में चिपके रहते हैं, जो कि केवल समस्याएं हैं एक चेतावनी या कार्यक्रम से बाहर निकलता है। यह मूर्खता पर सीमा है लेकिन इसके अलावा कुछ भी एक दावे के उद्देश्य को हरा देता है। –

    0

    यदि आप सभी संभावनाओं के बारे में तर्कसंगत रूप से समावेश करने की कोशिश कर रहे हैं, तो याद रखें कि इलेक्ट्रॉनिक सर्किट्री अंतरिक्ष से विकिरण से प्रभावित होने के लिए जाना जाता है। यदि सही फोटॉन/कण सही समय पर सही जगह पर हिट करता है, तो यह अन्यथा तार्किक रूप से असंभव राज्य संक्रमण का कारण बन सकता है।

    संभावना कमजोर है लेकिन अभी भी शून्य नहीं है।

    1

    यदि आप दावा का उपयोग कर रहे हैं तो आप Bertrand Meyer's Design by Contract दर्शन का पालन कर रहे हैं। यह एक प्रोग्रामिंग त्रुटि है - आपके द्वारा निर्दिष्ट अनुबंध (दावा) क्लाइंट (कॉलर) का पालन नहीं किया जा रहा है।

    +0

    बेशक, अनुबंध सही नहीं हो सकता है। मैंने पहले ऐसा किया है। हालांकि, या तो अनुबंध या ग्राहक छोटी है। –

    +0

    असल में नहीं। अनुबंध द्वारा दावा किया गया है। यदि ग्राहक अनुरूप नहीं है, तो यह मुद्दा है। – andyczerwonka

    0

    मैं एक मामले के बारे में सोच सकते हैं कि वास्तव में एक बग के रूप में नहीं वर्ग होगा:

    एक ज़ोर बाहरी कुछ है कि सामान्य रूप से होना चाहिए के लिए जाँच करने के लिए रखा गया है। आप एक मशीन पर होने वाली कुछ नट शिकार कर रहे हैं और आप जानना चाहते हैं कि कोई निश्चित कारक ज़िम्मेदार है या नहीं।

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

    अंततः स्टार्टअप में एक परीक्षण डालने का प्रयास किया गया ताकि यह देखने के लिए कि निर्देशिका छिपी हुई थी और अगर यह त्रुटि हो तो रोक रहा था।

    0

    नहीं। एक दावा विफलता का मतलब है कि कुछ ऐसा हुआ जो मूल प्रोग्रामर का इरादा नहीं था या होने की उम्मीद नहीं थी।

    यह इंगित कर सकते हैं:

    • एक बग अपने कोड में

    • एक बग अभिकथन में (मूल प्रोग्रामर भी उत्साही किया गया है (आप बस विधि गलत तरीके से बुला रहे हैं) और शिकायत कर रहा है आपके बारे में कुछ ऐसा करने के लिए जो काफी उचित है और विधि वास्तव में पूरी तरह से अच्छी तरह से संभाल लेगी।

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

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

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