मूल रूप से आप कैसे पता लगा सकते हैं कि आपका सबसे खराब या सबसे अच्छा मामला हो सकता है और किसी भी अन्य "किनारे" के मामले आपके पास हो सकते हैं और इसलिए, आप उनके लिए अपना कोड कैसे तैयार करेंगे?
मूल रूप से आप कैसे पता लगा सकते हैं कि आपका सबसे खराब या सबसे अच्छा मामला हो सकता है और किसी भी अन्य "किनारे" के मामले आपके पास हो सकते हैं और इसलिए, आप उनके लिए अपना कोड कैसे तैयार करेंगे?
जवाबों:
एल्गोरिथ्म की सामग्री के आधार पर आप पहचान सकते हैं कि डेटा संरचना / प्रकार / निर्माण का उपयोग क्या किया जाता है। फिर, आप उन लोगों के (संभव) कमजोर बिंदुओं को समझने की कोशिश करते हैं और एक निष्पादन योजना के साथ आने की कोशिश करते हैं जो इसे उन मामलों में चलाएगी।
उदाहरण के लिए, एल्गोरिथ्म इनपुट के रूप में एक स्ट्रिंग और एक पूर्णांक लेता है और स्ट्रिंग के वर्णों की कुछ छंटाई करता है।
हमारे साथ हैं:
कुछ ज्ञात विशेष मामलों के साथ स्ट्रिंग :
ज्ञात विशेष मामलों के साथ पूर्णांक :
क्रमबद्ध एल्गोरिथ्म जो निम्नलिखित सीमा मामलों में विफल हो सकता है:
फिर, इन सभी मामलों को लें और यह समझने की कोशिश करते हुए एक लंबी सूची बनाएं कि वे कैसे ओवरलैप करते हैं। उदाहरण के लिए:
अब उनके लिए टेस्ट केस बनाएं :)
संक्षिप्त सारांश : उन बुनियादी ब्लॉकों में एल्गोरिथ्म को तोड़ें जिनके लिए आप सीमा के मामलों को जानते हैं और फिर उन्हें फिर से इकट्ठा करते हैं, जिससे वैश्विक सीमा मामले बनते हैं
मुझे नहीं लगता कि किनारे की स्थिति निर्धारित करने के लिए कोई एल्गोरिथ्म है .... बस अनुभव।
उदाहरण: एक बाइट पैरामीटर के लिए आप 0, 127, 128, 255, 256, -1, जैसे नंबरों का परीक्षण करना चाहते हैं, जिससे कुछ भी परेशानी हो सकती है।
एक "बढ़त" के दो अर्थ हैं, और दोनों प्रासंगिक हैं जब यह किनारे के मामलों की बात आती है। एक छोर या तो एक ऐसा क्षेत्र है जहां इनपुट में एक छोटा सा बदलाव आउटपुट, या एक सीमा के अंत में बड़े परिवर्तन की ओर जाता है।
इसलिए, एक एल्गोरिथ्म के किनारे के मामलों की पहचान करने के लिए, मैं पहली बार इनपुट डोमेन को देखता हूं। इसके किनारे मान एल्गोरिथ्म के किनारे मामलों को जन्म दे सकते हैं।
दूसरे, मैं आउटपुट डोमेन को देखता हूं, और उन इनपुट मानों को देखता हूं जो उन्हें बना सकते हैं। यह कम से कम एल्गोरिदम के साथ एक समस्या है, लेकिन यह उन एल्गोरिदम में समस्याओं को खोजने में मदद करता है जो आउटपुट उत्पन्न करने के लिए डिज़ाइन किए गए हैं जो किसी दिए गए आउटपुट डोमेन को फैलाते हैं। उदाहरण के लिए एक यादृच्छिक संख्या जनरेटर सभी इच्छित आउटपुट मान उत्पन्न करने में सक्षम होना चाहिए।
अंत में, मैं यह देखने के लिए एल्गोरिथ्म की जांच करता हूं कि क्या इनपुट मामले हैं जो समान हैं, फिर भी असंतुष्ट आउटपुट तक ले जाते हैं। इन एज मामलों को खोजना सबसे कठिन है, क्योंकि इसमें दोनों डोमेन और एक जोड़ी इनपुट शामिल हैं।
यह एक बहुत ही सामान्य प्रश्न है, इसलिए मैं केवल कुछ सामान्य, अस्पष्ट विचारों को बाहर निकाल सकता हूं :)
-बाउंड्री मामलों की जांच करें। पूर्व। यदि आप एक स्ट्रिंग पार्स कर रहे हैं तो क्या होगा यदि स्ट्रिंग खाली या अशक्त है? यदि आप x से y की गिनती कर रहे हैं तो x और y में क्या होता है?
-सीधे सरल या DRY-ed बाहर किया जा सकता है। कोई भी अनावश्यक जटिलता उन चीजों को जोड़ सकती है जो गलत हो सकती हैं।
एल्गोरिदम का उपयोग करने के कौशल का हिस्सा उनकी कमजोरियों और रोग संबंधी मामलों को जान रहा है। विक्टर का उत्तर कुछ अच्छे सुझाव देता है, लेकिन सामान्य तौर पर मैं आपको सलाह दूंगा कि आपको इस बारे में महसूस करने के लिए अधिक गहराई से विषय का अध्ययन करने की आवश्यकता है, मुझे नहीं लगता कि आप इस प्रश्न का पूरी तरह से उत्तर देने के लिए अंगूठे के नियमों का पालन कर सकते हैं। उदाहरण के लिए कॉर्मेन , या स्कीना (विशेष रूप से स्कीना जहां एल्गोरिदम का उपयोग करने के लिए एक बहुत अच्छा खंड है और कुछ मामलों में अच्छी तरह से काम करता है, कॉर्मेन मुझे लगता है कि अधिक सिद्धांत में जाता है)।