मैं स्पष्ट नहीं हूँ कि TDD, कार्यप्रणाली, निम्नलिखित मामले को कैसे संभालती है। मान लीजिए कि मैं मर्जर एल्गोरिथ्म को पायथन में लागू करना चाहता हूं। मैं लिखकर शुरू करता हूं
assert mergesort([]) === []
और परीक्षण के साथ विफल रहता है
NameError: नाम 'mergesort' परिभाषित नहीं है
मैं फिर जोड़ता हूं
def mergesort(a):
return []
और मेरा इम्तिहान पास हो गया। आगे मैं जोड़ता हूँ
assert mergesort[5] == 5
और मेरा परीक्षण विफल रहता है
AssertionError
जिसके साथ मैं गुजरता हूं
def mergesort(a):
if not a:
return []
else:
return a
आगे, मैं जोड़ता हूं
assert mergesort([10, 30, 20]) == [10, 20, 30]
और मुझे अब इस पास को बनाने की कोशिश करनी होगी। मैं "मर्ज" एल्गोरिथ्म को जानता हूं इसलिए मैं लिखता हूं:
def mergesort(a):
if not a:
return []
else:
left, right = a[:len(a)//2], a[len(a)//2:]
return merge(mergesort(left)), mergesort(right))
और इसके साथ असफल हो जाता है
NameError: नाम 'मर्ज' परिभाषित नहीं है
अब यहाँ सवाल है। मैं mergeटीडीडी का उपयोग करके कैसे भाग सकता हूं और लागू करना शुरू कर सकता हूं ? ऐसा लगता है कि मैं नहीं कर सकता क्योंकि मेरे पास यह "लटका हुआ" अधूरा है mergesort, जिसकेmerge लिए परीक्षण विफल हो रहा है , जो समाप्त होने तक पारित नहीं होगा ! यदि यह परीक्षण चारों ओर लटका हुआ है, तो मैं वास्तव में TDD कभी नहीं कर सकता क्योंकि मैं अपने TDD पुनरावृत्तियों के निर्माण के दौरान "हरा" नहीं होगा merge।
ऐसा लगता है कि मैं निम्नलिखित तीन बदसूरत परिदृश्यों के साथ फंस गया हूं, और जानना चाहता हूं (1) इनमें से कौन सा TDD समुदाय पसंद करता है, या (2) एक और दृष्टिकोण है जो मुझे याद आ रहा है? मैंने कई अंकल बॉब टीडीडी वॉकथ्रू देखे हैं और इस तरह का मामला देखने से पहले याद नहीं करना चाहिए!
यहाँ 3 मामले हैं:
- एक अलग परीक्षण सूट के साथ एक अलग निर्देशिका में मर्ज लागू करें।
- हेल्पर फ़ंक्शन को विकसित करने के दौरान हरे होने की चिंता न करें, बस मैन्युअल रूप से ध्यान रखें कि आप किन परीक्षणों को वास्तव में पास करना चाहते हैं।
- टिप्पणी (GASP!) या
mergesortउस कॉल में लाइनों को हटा देंmerge; फिरmergeकाम करने के बाद , उन्हें वापस अंदर डाल दिया।
ये सब मुझे मूर्खतापूर्ण लगते हैं (या क्या मैं इसे गलत देख रहा हूँ?)। किसी को पसंदीदा दृष्टिकोण पता है?
mergesort। यदि आप ऐसा करने के लिए "सही" तरीके की तलाश कर रहे हैं, तो mergesortयूनिट परीक्षणों की एक श्रृंखला के लिए एल्गोरिथ्म के आपके मानचित्रण के बारे में सटीक होने के अलावा एक नहीं है ; यानी उन्हें प्रतिबिंबित करना चाहिए कि mergesortवास्तव में क्या होता है।
mergesortलाल-हरे-रिफ्लेक्टर से स्वाभाविक रूप से उभरने के लिए एक डिजाइन की उम्मीद कर रहे हैं , तो यह तब तक नहीं होगा जब तक कि आप अपने ज्ञान के आधार पर प्रक्रिया का मार्गदर्शन नहीं करते हैं mergesort।
mergeकेवल "रीफैक्टरिंग" चरण पर आविष्कार किया जाना चाहिए। यदि आप देखते हैं कि mergeविधि को mergesortआप के पासिंग टेस्ट के लिए पेश किया जा सकता है तो पहले अपने टेस्ट को बिना mergeविधि के पास करें । फिर mergeविधि लागू करके अपने कार्यान्वयन को प्रतिबिंबित करें ।
mergesort, चूंकि यह पहले से ही एक बहुत अच्छी तरह से परिभाषित एल्गोरिथ्म है, इसलिए इस खोज प्रक्रिया की आवश्यकता नहीं है, और फिर यह मानचित्रण का मामला बन जाता है जिसे आप पहले से ही इकाई परीक्षणों की एक श्रृंखला के लिए डिज़ाइन होना जानते हैं। संभवतः, आपके शीर्ष स्तर का परीक्षण यह दावा करता है कि परीक्षण के तहत आपका तरीका एक संग्रह को स्वीकार नहीं करता है और एक क्रमबद्ध रिटर्न देता है ...