क्यों एक त्रुटि इतनी आम है और हम उन्हें रोकने के लिए क्या कर सकते हैं?


20

ऐसा लगता है कि ऑफ-बाय-वन त्रुटियां सबसे अधिक हैं (यदि सबसे अधिक नहीं) आम प्रोग्रामिंग त्रुटियां (देखें /software/109/what-are-common-mistakes-in-coding , और पारंपरिक ज्ञान)।

क्या कारण है ये इतने सामान्य हैं, क्या यह मानव मस्तिष्क के साथ काम करने के लिए कुछ करना है?
हम एक त्रुटि के कारण गिरते शिकार को रोकने के लिए क्या कर सकते हैं?


8
क्या वे आम हैं? मैं बगों के अपने उचित हिस्से का उत्पादन कर रहा हूं, लेकिन उनमें से एक-एक त्रुटियां बहुत कम हैं। शायद इसलिए कि मैं ज्यादातर पायथन का उपयोग करता हूं, यानी सूचकांकों के साथ मजाक करने के बजाय पुनरावृत्तियों का उपयोग करता हूं? (और ... यह हमें क्या बताता है?))

जितना कम आपको सोचना होगा, आप उतने ही अधिक उत्पादक होंगे?
मालफिस्ट

@ डायलेन: मैं सहमत हूं। जब मैं कोडिंग कर रहा होता हूं तो ऑफ-वन-वन त्रुटियां आमतौर पर सबसे पहले पकड़ी जाती हैं (इससे पहले कि मैं आधिकारिक "परीक्षण चरण" पर जाऊं)।
FrustratedWithFormsDesigner

7
मैंने लगभग पिछले प्रश्न का उत्तर गलती से दिया ...
DevSolo

> हम एक त्रुटि से बंद शिकार को रोकने के लिए क्या कर सकते हैं? एक पुनरावृत्ति का उपयोग करें ।
जिम जी।

जवाबों:


18

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

संभवत: ऑफ-बाय-वन त्रुटियों से बचने का सबसे अच्छा तरीका एनकैप्सुलेशन है। उदाहरण के लिए, एक लूप के लिए उपयोग करने के बजाय जो इंडेक्स द्वारा एक संग्रह को पुनरावृत्त करता है (0 से गिनती - 1 तक), प्रत्येक तर्क के लिए फॉर-स्टाइल स्टाइल लूप का उपयोग करें जहां एन्यूमरेटर में बनाया गया है। इस तरह से आपको केवल संग्रह के ऊपर लूप करने के बजाए, एन्यूमरेटर लिखते समय केवल एक बार सीमा प्राप्त करनी होगी।


6
एन्कैप्सुलेशन के लिए +1। सबसे खराब ऑफ-बाय-वन बग मैंने कभी देखा है जब कार्यक्रम का हिस्सा 1-आधारित है और भाग 0-आधारित है, और इसका उपयोग किया गया हर एक फ़ंक्शन, आपको यह याद रखना होगा कि यह कौन सा था और क्या आपको करना है रूपांतरण करें या न करें और किस दिशा में जाएं। एक दो महीने पहले मैं एक मुश्किल ऑफ दर-नीचे ट्रैक करने के लिए किया था 2 त्रुटि क्योंकि गरीब कैप्सूलीकरण मतलब किसी को दो अलग-अलग स्थानों में कंपाउंडिंग बंद-दर-1 की गई त्रुटियों। वहाँ हर जगह वाले रूपांतरण का पालन करने के लिए असंभव थे और मैं करने के लिए इसे नीचे लाने के लिए कर रहा था एक में रूपांतरण एक विधि।
कार्ल बेवेलफेल्ट

2
अगर किसी के पास अधिक जानकारी है, तो मैं इस विज्ञान के बारे में अधिक जानना चाहूंगा। मुझे यह भी लगता है कि यही कारण है कि प्रोग्रामिक स्टाइल, सीएसएस की तरह, इतना निराशाजनक है कि सब कुछ किनारों पर है ...
कंपनी लेजर

7

मस्तिष्क सीमाओं और किनारों को कैसे संभालता है, इसके बारे में कुछ खास है।

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

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


4

मेरा मानना ​​है कि यह संदर्भ स्विचिंग के कारण है। हमारे दैनिक जीवन में हम 1-आधारित इंडेक्स का उपयोग करते हैं। इस वजह से हमारा मस्तिष्क सही व्यवहार को दीर्घकालिक स्मृति में जलाने में असमर्थ है।


2
और फिर प्रोग्रामिंग लैंगगेज के बीच स्विच करने का मज़ा है जो डीओ इंडेक्स 1 (जैसे पीएल / एसक्यूएल) पर शुरू होता है।
FrustratedWithFormsDesigner

3
उसके लिए +1। 1-अनुक्रमित नंबरिंग इस सवाल का जवाब देती है कि "कितने हैं?", जो कि अधिकांश वास्तविक दुनिया के कार्यों के लिए बड़े करीने से मैप करता है। 0-अनुक्रमित के बारे में है "प्रत्येक वस्तु किस स्थिति में है?", जो कि मीटस्पेस में कम उपयोग का है।
दान रे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.