TDD का उपयोग करते समय किसी फ़ंक्शन या सुविधा को कैसे निकालें


20

TDD के बारे में ग्रंथों में मैं अक्सर "दोहराव को हटाता हूं" या "पुनरावृत्ति में सुधार" के बारे में पढ़ता हूं। लेकिन मुझे एक अप्रयुक्त फ़ंक्शन को हटाने से क्या होता है?

उदाहरण के लिए मान लें कि Cविधियों के साथ एक वर्ग है a()और b()। अब मुझे लगता है कि ऐसा तरीका करना अच्छा होगा f()जो इसमें शामिल हो C। वास्तव में परिभाषित किए गए / वर्णित यूनिट परीक्षणों के अपवाद के साथ f()सभी कॉलों को बदलता है । अब इसकी जरूरत नहीं है - परीक्षणों को छोड़कर।b()b()

क्या इसे हटाने b()और इसे इस्तेमाल करने वाले सभी परीक्षणों को सहेजना है? क्या वह "पठनीयता में सुधार" का हिस्सा है?


3
केवल यह जाँचने के लिए कि परीक्षण मौजूद नहीं है, और फिर असफल टेस्टस्क्यूज़ को ठीक करने के लिए एक और परीक्षण जोड़ें;)
फिलिप हाग्लंड

@FilipHaglund भाषा के आधार पर यह संभव हो सकता है। लेकिन कोड प्रलेखन के रूप में यह अजीब लगेगा।
टोबिकमोनोबाय

1
बस किसी के लिए जो बेहतर नहीं जानता है: @ FilipHaglund की टिप्पणी स्पष्ट रूप से एक मजाक है। ऐसा मत करो।
ज्योत

जवाबों:


16

हां बिल्कुल। पढ़ने के लिए सबसे आसान कोड वह है जो वहां नहीं है।

उस ने कहा, आम तौर पर refactoring का मतलब अपने व्यवहार को बदलने के बिना कोड में सुधार करना है। यदि आप कुछ ऐसा सोचते हैं जो कोड को बेहतर बनाता है, तो बस करें। आपको इसे करने की अनुमति देने से पहले इसे कुछ कबूतर छेद में फिट करने की कोई आवश्यकता नहीं है।


@ jpmc26 फुर्तीली, आदमी, फुर्तीला! :-)
टोबीमकोनबी

1
"पढ़ने के लिए सबसे आसान कोड वह है जो वहाँ नहीं है।" - मैं दीवार पर उस बोली को लटका रहा हूं: D
winkbrace

27

एक सार्वजनिक विधि को हटाना "रिफैक्टिंग" नहीं है - मौजूदा परीक्षणों को जारी रखने के दौरान रिफैक्टरिंग कार्यान्वयन को बदल रहा है।

हालांकि, एक अनावश्यक विधि को हटाना पूरी तरह से उचित डिजाइन परिवर्तन है।

टीडीडी कुछ हद तक इसे बाहर निकालता है, क्योंकि परीक्षणों की समीक्षा करने में, आप देख सकते हैं कि यह एक गैर-परीक्षण पद्धति का परीक्षण कर रहा है। परीक्षण आपके डिजाइन को चला रहे हैं, क्योंकि आप "देखो, इस परीक्षण का मेरे लक्ष्य से कोई लेना-देना नहीं है"।

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

एक विधि को हटाने के लिए दो दृष्टिकोण हैं; दोनों अलग-अलग परिस्थितियों में काम करते हैं:

  1. विधि हटाएँ। किसी भी निर्भर कोड और परीक्षणों को हटाने के लिए, संकलन त्रुटियों का पालन करें। यदि आप संतुष्ट हैं कि प्रभावित परीक्षण डिस्पोजेबल हैं, तो अपने बदलाव करें। यदि नहीं, तो वापस रोल करें।

  2. उन परीक्षणों को हटा दें जिन्हें आप अप्रचलित मानते हैं। कोड कवरेज के साथ अपना पूरा परीक्षण सूट चलाएं। उन विधियों को हटाएं जिनका परीक्षण सूट द्वारा नहीं किया गया है।

(यह निर्धारित करता है कि आपके परीक्षण सूट को शुरू करने के लिए अच्छा कवरेज है)।


10

वास्तव में f () सभी कॉल को b () में बदल देता है, यूनिट यूनिट टेस्ट के अपवाद के साथ जो परिभाषित / वर्णित बी () है।

IMHO ठेठ TDD चक्र इस तरह दिखेगा:

  • f () के लिए असफल परीक्षण लिखना (शायद b () के लिए परीक्षणों पर आधारित): परीक्षण लाल हो जाते हैं

  • एफ लागू करें () -> परीक्षण हरे हो जाते हैं

  • रिफैक्टर : -> बी हटाएं () और बी के लिए सभी परीक्षण ()

अंतिम चरण के लिए, आप पहले b () को हटाने पर विचार कर सकते हैं और देखें कि क्या होता है (संकलित भाषा का उपयोग करते समय, संकलक को केवल मौजूदा परीक्षणों के बारे में शिकायत करनी चाहिए, जब नहीं, तो b के लिए पुरानी इकाई परीक्षण विफल हो जाएगा, इसलिए यह है) स्पष्ट है कि आपको उन्हें भी हटाना है)।


4

हाँ यही है।

सबसे अच्छा, सबसे बग-मुक्त, सबसे पठनीय कोड वह कोड है जो मौजूद नहीं है। अपनी आवश्यकताओं को पूरा करते हुए यथासंभव गैर-कोड लिखने का प्रयास करें।


9
आप "कैसे" भाग से चूक गए।
जेएफओ

2

इसे हटाने के लिए वांछनीय है b()कि यह अब उपयोग न हो, उसी कारण से कि यह वांछनीय है कि पहली जगह में अन-यूज्ड फ़ंक्शंस को न जोड़ें। चाहे आप इसे "पठनीयता" कहें या कुछ और, सभी समान होने के नाते यह कोड में सुधार है कि इसमें ऐसा कुछ भी नहीं है जिसका इसके लिए कोई उपयोग नहीं है। कम से कम एक विशिष्ट माप होने के लिए जिसके द्वारा इसे न करना बेहतर है, इसे हटाने से यह गारंटी मिलती है कि परिवर्तन के बाद इसकी भविष्य के रखरखाव की लागत शून्य है!

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

तर्क है कि आम तौर पर मेरे लिए काम करता की लाइन बिंदु पर मैं कहाँ देखा कि वह यह है कि f()बना दिया है b()अप्रचलित, इसलिए b()कम से कम पदावनत किया जाना चाहिए, और मैं करने के लिए सभी कॉल्स को खोजने के लिए देख रहा हूँ b()उन्हें कॉल के साथ की जगह ले करने के इरादे से f(), मैं परीक्षण कोड पर भी विचार करें । विशेष रूप से, यदि b()अब आवश्यकता नहीं है , तो मुझे इसकी इकाई परीक्षणों को हटाना चाहिए।

आप काफी सही हैं कि कुछ भी मुझे नोटिस करने के लिए मजबूर नहीं करता b()है जो अब आवश्यक नहीं है। यह कौशल की बात है (और, जैसा कि स्लिम कहते हैं, उच्च स्तरीय परीक्षणों पर कोड कवरेज रिपोर्ट)। यदि केवल यूनिट परीक्षण, और कोई कार्यात्मक परीक्षण, का संदर्भ लें b(), तो मैं सतर्क रूप से आशावादी हो सकता हूं कि यह किसी भी प्रकाशित इंटरफ़ेस का हिस्सा नहीं है और इसलिए इसे हटाना मेरे प्रत्यक्ष नियंत्रण में नहीं किसी भी कोड के लिए एक ब्रेकिंग परिवर्तन नहीं है।

लाल / हरा / रिफलेक्टर चक्र स्पष्ट रूप से परीक्षण हटाने का उल्लेख नहीं करता है। इसके अलावा, को हटाने b()खुला / बंद सिद्धांत का उल्लंघन करता है के बाद से स्पष्ट रूप से अपने घटक है संशोधन के लिए खुला। इसलिए यदि आप इस कदम को साधारण टीडीडी के बाहर की तरह समझना चाहते हैं, तो आगे बढ़ें। उदाहरण के लिए, आपके पास एक परीक्षण "खराब" घोषित करने के लिए कुछ प्रक्रिया हो सकती है, जिसे इस मामले में इस आधार पर परीक्षण को हटाने के लिए लागू किया जा सकता है कि यह उस चीज के लिए परीक्षण करता है जो वहां नहीं होनी चाहिए (अनावश्यक फ़ंक्शन b())।

मुझे लगता है कि ज्यादातर लोग शायद एक निश्चित मात्रा में रिडिजाइन की अनुमति लाल / हरे / रिफ्लेक्टर चक्र के साथ देते हैं, या वे निरर्थक बोलने के बावजूद निरर्थक यूनिट परीक्षणों को हटाने का एक "रिफ्लेक्टर" मानते हैं। यह रिफैक्टिंग नहीं है। आपकी टीम तय कर सकती है कि इस फैसले को सही ठहराने के लिए कितना नाटक और कागजी कार्रवाई होनी चाहिए।

वैसे भी, अगर b()यह महत्वपूर्ण था , तो इसके लिए कार्यात्मक परीक्षण होंगे, और जिन्हें हल्के से नहीं हटाया जाएगा, लेकिन आपने पहले ही कहा है कि केवल यूनिट परीक्षण हैं। यदि आप इकाई परीक्षणों (कोड के वर्तमान आंतरिक डिजाइन, जिसे आपने बदल दिया है) और कार्यात्मक परीक्षण (प्रकाशित इंटरफेस, जो शायद आप बदलना नहीं चाहते हैं के लिए लिखा है) के बीच ठीक से अंतर नहीं करते हैं, तो आपको अधिक सतर्क रहने की आवश्यकता है इकाई परीक्षण हटाने के बारे में।


2

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

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


कोड हटाना सामान्य रूप से कोई समस्या नहीं है। मुझे लाइन्स, फ़ंक्शंस या ... अच्छी तरह से, पूरे मॉड्यूल को हटाने के लिए हटाना पसंद है! अगर संभव हो तो। और मैं यह सब टीडीडी के साथ या बिना करता हूं। लेकिन: क्या TDD वर्कफ़्लो में एक बिंदु है जहाँ (गैर-डुप्ली) कोड हटा दिया जाता है? यदि नहीं, तो इसे वैसे भी हटा दिया जाएगा। लेकिन वहाँ है? यह मेरा सवाल था।
टोबिकमोनमोबी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.