"पास होने तक टेस्ट + रिफ्लेक्टर लिखो" दृष्टिकोण अविश्वसनीय रूप से इंजीनियरिंग विरोधी है।
आपको रिफैक्टरिंग और टीडीडी दोनों के बारे में गलत धारणा है।
कोड रीफैक्टरिंग सॉफ्टवेयर के कुछ गैर-गुणात्मक विशेषताओं को बेहतर बनाने के लिए अपने बाहरी कार्यात्मक व्यवहार को संशोधित किए बिना कंप्यूटर प्रोग्राम के स्रोत कोड को बदलने की प्रक्रिया है।
इस प्रकार आप कोड को तब तक रिफलेक्टर नहीं कर सकते जब तक यह पास न हो जाए।
और टीडीडी, विशेष रूप से इकाई परीक्षण (जिसे मैं मुख्य सुधार मानता हूं, क्योंकि अन्य परीक्षण मेरे लिए बहुत प्रशंसनीय लगते हैं), एक घटक को फिर से तैयार करने के बारे में नहीं है जब तक यह काम नहीं करता है। यह एक घटक को डिज़ाइन करने और कार्यान्वयन पर काम करने के बारे में है जब तक कि घटक डिज़ाइन के अनुसार काम नहीं करता है।
इसके अलावा यह वास्तव में समझ के लिए महत्वपूर्ण है, कि इकाई परीक्षण परीक्षण इकाइयों के बारे में है । हमेशा खरोंच से बहुत सारी चीजें लिखने की प्रवृत्ति के कारण, ऐसी इकाइयों का परीक्षण करना महत्वपूर्ण है। एक सिविल इंजीनियर पहले से ही उन इकाइयों के चश्मे को जानता है जो वह (विभिन्न सामग्रियों) का उपयोग करता है और उनसे काम करने की उम्मीद कर सकता है। ये दो चीजें हैं जो अक्सर सॉफ़्टवेयर इंजीनियरों पर लागू नहीं होती हैं, और इकाइयों का उपयोग करने से पहले उनका परीक्षण करने के लिए बहुत समर्थक इंजीनियरिंग है, क्योंकि इसका मतलब है कि परीक्षण किए गए, उच्च-गुणवत्ता वाले घटकों का उपयोग करना।
यदि एक सिविल इंजीनियर को स्टेडियम को कवर करने के लिए छत बनाने के लिए कुछ नए फाइबर ऊतक का उपयोग करने का विचार था, तो आप उससे एक इकाई के रूप में परीक्षण करने की अपेक्षा करेंगे, अर्थात आवश्यक ऐनक (जैसे वजन, पारगम्यता, स्थिरता, आदि) को परिभाषित करेंगे और इसके बाद परीक्षण करें और इसे तब तक परिष्कृत करें जब तक कि यह उन्हें पूरा न करें।
यही कारण है कि टीडीडी काम करता है। क्योंकि यदि आप परीक्षण की गई इकाइयों के सॉफ़्टवेयर का निर्माण करते हैं, तो संभावना बहुत बेहतर है कि यह काम करता है, जब आप उन्हें एक साथ प्लग करते हैं और यदि यह नहीं करता है कि आप समस्या को अपने गोंद कोड में होने की उम्मीद कर सकते हैं, तो मान लें कि आपके परीक्षणों में अच्छा कवरेज है।
संपादित करें:
Refactoring का अर्थ है: कार्यक्षमता में कोई परिवर्तन नहीं । यूनिट टेस्ट लिखने का एक बिंदु यह सुनिश्चित करना है, कि रिफैक्टरिंग कोड को नहीं तोड़ता है। इसलिए टीडीडी को आश्वस्त करने के लिए है, कि रिफैक्टिंग के दुष्प्रभाव नहीं हैं।
ग्रैन्युलैरिटी परिप्रेक्ष्य का विषय नहीं है, क्योंकि जैसा कि मैंने कहा, यूनिट टेस्ट टेस्ट यूनिट और सिस्टम नहीं है, जिससे ग्रैन्युलैरिटी बिल्कुल परिभाषित होती है।
टीडीडी अच्छी वास्तुकला को प्रोत्साहित करता है। आपको अपनी सभी इकाइयों के लिए विशिष्टताओं को परिभाषित करने और उन्हें लागू करने की आवश्यकता है, जो आपको उन्हें लागू करने से पहले डिजाइन करने के लिए मजबूर करते हैं, जो आपको लगता है कि इसके विपरीत है। टीडीडी इकाइयों के निर्माण को निर्देशित करता है, जिसे व्यक्तिगत रूप से परीक्षण किया जा सकता है और इस प्रकार पूरी तरह से डिकोड किया जाता है।
TDD का मतलब यह नहीं है कि मैं स्पेगेटी-कोड में एक सॉफ्टवेयर परीक्षण फेंक देता हूं और पास्ता को तब तक हिलाता हूं जब तक कि यह गुजर न जाए।
सिविल इंजीनियरिंग के विपरीत, सॉफ्टवेयर इंजीनियरिंग में एक परियोजना आमतौर पर लगातार विकसित होती है। सिविल इंजीनियरिंग में, आपको स्थिति ए में एक पुल बनाने की आवश्यकता होती है, जो x टन ले जा सकता है और प्रति घंटे n वाहनों के लिए पर्याप्त चौड़ा है।
सॉफ्टवेयर इंजीनियरिंग में, ग्राहक मूल रूप से किसी भी बिंदु पर निर्णय ले सकता है (संभवतः पूरा होने के बाद), वह एक डबलडेक ब्रिज चाहता है, और वह चाहता है कि वह निकटतम मोटरवे के साथ जुड़ा हो, और वह इसे एक उठाने वाला पुल बनाना चाहेगा, क्योंकि उसकी कंपनी हाल ही में नौकायन जहाजों का उपयोग करना शुरू किया।
सॉफ्टवेयर इंजीनियरों को डिजाइन बदलने का काम सौंपा जाता है। इसलिए नहीं कि उनके डिजाइन त्रुटिपूर्ण हैं, बल्कि इसलिए कि यह मॉडस ऑपरेंडी है। यदि सॉफ्टवेयर अच्छी तरह से इंजीनियर है, तो इसे सभी निम्न स्तर के घटकों को फिर से लिखने के बिना, उच्च स्तर पर पुन: डिज़ाइन किया जा सकता है।
टीडीडी व्यक्तिगत रूप से परीक्षण किए गए, अत्यधिक विघटित घटकों के साथ सॉफ्टवेयर बनाने के बारे में है। अच्छी तरह से निष्पादित, यह आपको बिना किसी की तुलना में, तेजी से और सुरक्षित रूप से आवश्यकताओं में परिवर्तन का जवाब देने में मदद करेगा।
TDD विकास प्रक्रिया में आवश्यकताएं जोड़ता है, लेकिन यह गुणवत्ता आश्वासन के किसी भी अन्य तरीके को प्रतिबंधित नहीं करता है। दी गई, टीडीडी औपचारिक सत्यापन के समान सुरक्षा प्रदान नहीं करता है, लेकिन फिर, औपचारिक सत्यापन प्रणाली स्तर पर उपयोग करने के लिए बेहद महंगा और असंभव है। और फिर भी, यदि आप चाहते थे, तो आप दोनों को जोड़ सकते हैं।
टीडीडी में यूनिट परीक्षणों के अलावा अन्य परीक्षण भी शामिल हैं, जो सिस्टम स्तर पर किए जाते हैं। मुझे ये समझाने में आसान लगता है लेकिन निष्पादित करने में मुश्किल और मापने में मुश्किल होती है। इसके अलावा, वे काफी प्रशंसनीय हैं। जबकि मैं पूरी तरह से उनकी आवश्यकता को देखता हूं, मैं वास्तव में उन्हें विचारों के रूप में महत्व नहीं देता।
अंत में, कोई भी उपकरण वास्तव में एक समस्या हल नहीं करता है। उपकरण केवल एक समस्या को हल करना आसान बनाते हैं। आप पूछ सकते हैं: एक छेनी बड़ी वास्तुकला के साथ मेरी मदद कैसे करेगी? वैसे अगर आप सीधी दीवारें करने की योजना बनाते हैं, तो सीधी ईंटें मदद की हैं। और हाँ, अगर आप उस उपकरण को किसी बेवकूफ को देते हैं, तो वह संभवत: इसे अपने पैर के माध्यम से अंत में मार देगा, लेकिन यह छेनी की गलती नहीं है, क्योंकि यह टीडीडी का दोष नहीं है कि यह नौसिखियों को झूठी सुरक्षा देता है, जो अच्छे परीक्षण नहीं लिखते हैं।
इसलिए नीचे की रेखा पर, कोई कह सकता है कि टीडीडी बिना टीडीडी से बहुत बेहतर काम करता है।