क्या टीडीडी पद्धति को टॉप-डाउन लागू किया जा सकता है?


13

मैं स्पष्ट नहीं हूँ कि 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 मामले हैं:

  1. एक अलग परीक्षण सूट के साथ एक अलग निर्देशिका में मर्ज लागू करें।
  2. हेल्पर फ़ंक्शन को विकसित करने के दौरान हरे होने की चिंता न करें, बस मैन्युअल रूप से ध्यान रखें कि आप किन परीक्षणों को वास्तव में पास करना चाहते हैं।
  3. टिप्पणी (GASP!) या mergesortउस कॉल में लाइनों को हटा दें merge; फिर mergeकाम करने के बाद , उन्हें वापस अंदर डाल दिया।

ये सब मुझे मूर्खतापूर्ण लगते हैं (या क्या मैं इसे गलत देख रहा हूँ?)। किसी को पसंदीदा दृष्टिकोण पता है?


2
टीडीडी के लक्ष्य का एक हिस्सा आपको सॉफ्टवेयर डिजाइन बनाने में मदद करना है। उस डिज़ाइन प्रक्रिया का एक हिस्सा यह खोज रहा है कि वांछित परिणाम का उत्पादन करने के लिए क्या आवश्यक है। के मामले में mergesort, चूंकि यह पहले से ही एक बहुत अच्छी तरह से परिभाषित एल्गोरिथ्म है, इसलिए इस खोज प्रक्रिया की आवश्यकता नहीं है, और फिर यह मानचित्रण का मामला बन जाता है जिसे आप पहले से ही इकाई परीक्षणों की एक श्रृंखला के लिए डिज़ाइन होना जानते हैं। संभवतः, आपके शीर्ष स्तर का परीक्षण यह दावा करता है कि परीक्षण के तहत आपका तरीका एक संग्रह को स्वीकार नहीं करता है और एक क्रमबद्ध रिटर्न देता है ...
रॉबर्ट हार्वे

1
... बाद की इकाई परीक्षण धीरे-धीरे वास्तविक यांत्रिकी में गहरा खोदेंगे mergesort। यदि आप ऐसा करने के लिए "सही" तरीके की तलाश कर रहे हैं, तो mergesortयूनिट परीक्षणों की एक श्रृंखला के लिए एल्गोरिथ्म के आपके मानचित्रण के बारे में सटीक होने के अलावा एक नहीं है ; यानी उन्हें प्रतिबिंबित करना चाहिए कि mergesortवास्तव में क्या होता है।
रॉबर्ट हार्वे

4
डिजाइन अकेले यूनिट परीक्षणों से नहीं बढ़ता है; यदि आप mergesortलाल-हरे-रिफ्लेक्टर से स्वाभाविक रूप से उभरने के लिए एक डिजाइन की उम्मीद कर रहे हैं , तो यह तब तक नहीं होगा जब तक कि आप अपने ज्ञान के आधार पर प्रक्रिया का मार्गदर्शन नहीं करते हैं mergesort
रॉबर्ट हार्वे

3
भारी सिफारिश की: geekswithblogs.net/theArchitectsNapkin/archive/2014/02/10/…
Doc Brown

1
TDD में mergeकेवल "रीफैक्टरिंग" चरण पर आविष्कार किया जाना चाहिए। यदि आप देखते हैं कि mergeविधि को mergesortआप के पासिंग टेस्ट के लिए पेश किया जा सकता है तो पहले अपने टेस्ट को बिना mergeविधि के पास करें । फिर mergeविधि लागू करके अपने कार्यान्वयन को प्रतिबिंबित करें ।
फैबियो

जवाबों:


13

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

  1. आपको किसी भी उत्पादन कोड को लिखने की अनुमति नहीं है जब तक कि यह एक असफल इकाई परीक्षण पास न हो।
  2. आपको एक इकाई परीक्षण लिखने की अनुमति नहीं है जो असफल होने के लिए पर्याप्त है; और संकलन विफलताओं विफलताओं हैं।
  3. आपको किसी भी अधिक उत्पादन कोड को लिखने की अनुमति नहीं है , एक असफल इकाई परीक्षा पास करने के लिए पर्याप्त है।

इसलिए, नियम संख्या 3 को पढ़ने का एक तरीका यह है कि आपको mergeपरीक्षा पास करने के लिए फ़ंक्शन की आवश्यकता है , इसलिए आप इसे लागू कर सकते हैं - लेकिन केवल अपने मूल रूप में।

या, वैकल्पिक रूप से, आप मर्ज ऑपरेशन इनलाइन लिखकर शुरू करते हैं, और फिर कार्य करने के लिए परीक्षण प्राप्त करने के बाद इसे एक फ़ंक्शन में रिफ्लेक्टर करते हैं।

एक और व्याख्या यह है कि आप मर्जसॉर्ट लिख रहे हैं, आप जानते हैं कि आपको एक mergeऑपरेशन की आवश्यकता होगी (यानी, यह YAGNI नहीं है, जो कि "पर्याप्त" नियम को पर्दा करने का प्रयास करता है)। इसलिए, आपको मर्ज के लिए परीक्षणों के साथ शुरू करना चाहिए, और उसके बाद ही कुल मिलाकर परीक्षणों के लिए आगे बढ़ना चाहिए।


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

@RayToal - मैं वास्तव mergeमें सॉर्ट करने से पहले ऑपरेशन का पूरी तरह से परीक्षण करने के दृष्टिकोण की ओर झुक गया हूं (साथ ही partitionऑपरेशन के अलग-अलग परीक्षण )। मुझे लगता है कि दावा किया गया लाभ आकस्मिक डिजाइन धीरे-धीरे एक ज्ञात लक्ष्य की ओर काम करने से आता है। विलय के मामले में, मुझे नहीं लगता कि लक्ष्य सामान्य रूप से हल हो रहा है (क्योंकि तब आप बुलबुले की तरह खत्म हो जाएंगे)। आप मूल संचालन को जानते हैं, इसलिए आप उन परिचालनों की ओर काम करते हैं; सॉर्ट ज्यादातर एक बाद है।
kdgregory

1
एक अगला विकल्प है। mergeफ़ंक्शन को पास करें mergesortऔर उसके व्यवहार का मजाक उड़ाएं। फिर वापस जाएं और mergeपहले परीक्षण लागू करें । प्रतिनिधि भयानक हैं ™।
रबरडक

@RubberDuck मुख्य डोमेन का एक अभिन्न अंग मॉकिंग कुछ परेशानियों का कारण बन सकता है, विशेष रूप से जब आप प्रोग्राम चलाते हैं और मॉक किए गए और मर्ज फ़ंक्शन कम से कम विवरण में भिन्न होते हैं। उस तरह का एक दृष्टिकोण ऐसे उदाहरणों के लिए छोड़ दिया जाना चाहिए जहां आप बाहरी संसाधनों के साथ काम कर रहे हैं जैसे कि सूची जहां से क्रमबद्ध होती है।
क्लैमच
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.