अगर TDD डिजाइन के बारे में है तो मुझे इसकी आवश्यकता क्यों है? [बन्द है]


10

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


14
यदि वे इसके बिना अच्छा कर रहे हैं, तो उन्हें इसकी आवश्यकता नहीं है। प्रत्येक "सर्वश्रेष्ठ अभ्यास" सभी के लिए काम नहीं करता है।
रुके

1
इसी तरह के एक सवाल का मेरा जवाब: प्रोग्रामर.स्टैकएक्सचेंज.
com/

जवाबों:


18

टीडीडी मुझे केवल सर्वश्रेष्ठ अंतिम डिजाइन में आने में मदद नहीं करता है, इससे मुझे कम प्रयासों में मदद मिलती है।

मुझे लगता है कि मुझे कौन सा डिज़ाइन सबसे अच्छा लगा, यह तय करने से पहले एक समस्या पर दो या तीन स्टैब्स होते थे। अब, ठीक यही समय परीक्षण लिखने और मेरे दिमाग को सही डिजाइन पर केंद्रित करने में व्यतीत होता है। और, एक बोनस के रूप में, यह मुझे दोहराए जाने वाले परीक्षणों के एक सूट के साथ छोड़ देता है। जीत!

उस ने कहा, अनिवार्य रूप से ऐसे लोग होने जा रहे हैं जिनके लिए टीडीडी कुछ भी नहीं प्रदान करता है। जब तक वे अभी भी इसके अंत में स्वचालित, दोहराए जाने वाले परीक्षण करते हैं, तब तक यह ठीक है।


4
कम प्रयासों में, वास्तव में?
साइबेरियाईगूई

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

4
देखें, तो उस शब्द फिर से है, forced। मुझे नहीं पता कि लोग शब्द "मजबूर" की आवृत्ति से अधिक बार परेशान नहीं होते हैं क्योंकि यह टीडीडी के बारे में चर्चा में होता है। किसी को कुछ सही ढंग से डिजाइन करने के लिए मजबूर करने की आवश्यकता नहीं है; उन्हें सीखना चाहिए कि चीजों को सही तरीके से कैसे डिज़ाइन किया जाए, और फिर ऐसा करने के लिए मजबूर किए बिना ऐसा करना जारी रखें, खासकर जब कि जबरदस्ती का कार्य इतना अविश्वसनीय रूप से समय लेने वाला होता है।
री मियाकाका

3
@ री: लोग अधिक बार परेशान नहीं होते हैं क्योंकि वे जानते हैं कि दूसरे व्यक्ति का वास्तव में "धक्का" या "निर्देशित" या ... का मतलब है और यहां एक रहस्योद्घाटन है जब आप टेस्ट ड्रिवेन डेवलपमेंट के बारे में बात कर रहे हैं ... शायद "संचालित" । और हां, कुछ लोग यह पा सकते हैं कि वे स्वाभाविक रूप से ऐसा सोचते हैं, बिना प्रेरित हुए, मैंने कहा कि पोस्ट में। लेकिन आप अभी भी अपने सॉफ्टवेयर का परीक्षण करने के लिए मिल गए हैं ताकि आप ज्यादा बेहतर न हों।
पीडीआर

3
जब कोई कहता है कि "मॉड्यूलर डिजाइन को मजबूर करता है", तो वे वास्तव में मजबूर होते हैं। टीडीडी के साथ एक गैर-रचना योग्य डिजाइन बनाने के लिए यह बहुत मुश्किल है (यदि असंभव नहीं है), और यह एक अच्छी बात है। यह समस्या बलहीन होने का यह अंतिम परिणाम नहीं है; यह मेनियल, रटे प्रयास की मात्रा है। उचित डिजाइन एक सिखाने योग्य और सीखने योग्य कौशल है, और सीखने पर खर्च करने के लिए समय चाहिए। इसके अलावा, TDD के लिए लिखे गए परीक्षण कीड़े को पकड़ने के लिए लिखे गए परीक्षणों जैसे नहीं लगते हैं। अगर वे करते हैं, तो कुछ गलत है
री मियासाका

12

यह विशेष रूप से टीडीडी गुरु वास्तव में कहने की कोशिश कर रहा है कि टीडीडी एक डिजाइन प्रक्रिया है (हालांकि कई लोगों ने दुर्भाग्य से इसे इस तरह से व्याख्या किया है)। यहां संदेश यह है कि टीडीडी जैसी प्रक्रिया का उपयोग करते हुए, यदि आप इसे सही करते हैं, तो आपके समग्र डिजाइन में सुधार होगा।

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

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

यदि आप परीक्षण नहीं लिखते हैं, और आप केवल 15% कोड कवरेज की गिनती नहीं करते हैं, तो आप "परीक्षण परीक्षण" नहीं कर सकते हैं और परीक्षण के लिए डिज़ाइन नहीं कर रहे हैं, तो आप नहीं जान सकते।

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


1
एक अच्छे डिजाइन के बिंदु का सिर्फ परीक्षण नहीं किया जा रहा है। लेकिन हाँ, TDD त्रुटिपूर्ण डिजाइनों को देखने के लिए एक अच्छा साधन है।
deadalnix

4

TDD सीखने के लिए किसी के प्रयास से आने वाला सरल उत्तर: आपको इसकी आवश्यकता नहीं है, लेकिन इससे आपको जो बड़ा लाभ होता है, वह बहुत ही सरलता से होता है, आत्मविश्वास : आपका आवेदन काम करता है। विश्वास है कि उपयोग के मामले संतुष्ट हैं। विश्वास है कि आपके तर्क "फोबार" मॉड्यूल के लिए ध्वनि है। विश्वास है कि आपके कोड को सड़क के नीचे छह महीने तक बनाए रखने योग्य और एक्स्टेंसिबल होने के लिए ठीक से संरचित किया जाता है जब सीईओ कुछ नए पागल फीचर में जोड़ना चाहता है, जिसके बारे में वह पढ़ता है। विश्वास है कि, जब आपका आवेदन बढ़ता है, तो स्थापत्य कला के लिए नींव रखी गई है कि वह नए फीचर्स के साथ जूरी-रिग की नई विशेषताओं के लिए गॉब्स हैक्स की आवश्यकता न हो।

मुझे लगता है कि ऊपर थोड़ा सा लग रहा था लेकिन मैं कैसे TDD के लाभ को देखता हूं। भले ही आप टीडीडी का उपयोग करके अच्छे, ठोस, अच्छी तरह से तैयार किए गए डिजाइन बना सकते हैं, लेकिन यह आपके काम को सही करने में मदद करता है, और फिर साबित करता है कि चीजें सही तरीके से की गई हैं, और अधिक महत्वपूर्ण बात यह है कि चीजों को सही रखने के लिए एक आधार रेखा प्रदान करता है । बहुत कम से मैंने टीडीडी में डब किया हुआ है, इसका उपयोग करके मुझे कोड को साफ करने और उचित सॉफ्टवेयर इंजीनियरिंग अवधारणाओं का पालन करने के लिए मजबूर किया गया है, जहां अन्यथा मैं "सबसे तेज संभव" करूंगा, जिसके परिणामस्वरूप अक्सर गड़बड़ "हैक" कोड होता है।


+1 TDD प्रतिक्रिया है। फीडबैक के अधिकांश उपायों के अनुसार, यह काफी उद्देश्यपूर्ण और पूरी तरह से स्वचालित है, इसलिए इसे सभी कौशल स्तरों के टीम के सदस्यों द्वारा साझा किया जा सकता है। TDD से पहले, अच्छा कोड कुछ ऐसा था जिसे आपने "महसूस किया" था, या उपयोगकर्ताओं द्वारा सॉफ़्टवेयर प्राप्त करने के कुछ समय बाद पुष्टि की गई थी। लूप जितना छोटा होगा, आपको उतना ही अधिक आत्मविश्वास महसूस होगा। दुर्भाग्य से टीडीडी एक अच्छा डिजाइन "महसूस" के रूप में अति आत्मविश्वास के लिए प्रवण है, लेकिन यह स्वयं को सही करने के लिए बहुत आसान है।
स्टीव जैक्सन

2

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

  • टीडीडी मुझे लागू करने से पहले सोचता है, जो आमतौर पर बहुत अच्छा अभ्यास है जो बहुत सारे शूट और भूल समाधानों को रोकता है
  • यह मुझे समस्या के छोटे भागों में सोचने के लिए मजबूर करता है, जो मुझे एक साथ फिट होने वाले छोटे टुकड़ों के समाधान को तोड़ने के लिए मजबूर करता है।
  • यह मुझे बहुत डिकोड किए गए कोड को लिखता है क्योंकि जब भी मुझे स्टब / मॉक / नकली कुछ करना पड़ता है जो समस्या में फिट नहीं होता है, तो मैं स्वाभाविक रूप से एक "डब्ल्यूटीएफ फेंक देता हूं, मुझे ऐसा क्यों करना चाहिए अगर मुझे इसके साथ युग्मित नहीं होना है" । और यह मुझे बेहतर चीजों के बीच संबंध का एहसास कराता है।
  • यह मुझे अपने कोड के लिए आसानी से निष्पादन योग्य चेक का सेट देता है, इसलिए मुझे कोड के डिबगिंग की दर्दनाक "var_dump", "p", "pp", "इको" शैली से नहीं गुजरना पड़ता है। यह सिर्फ रिपोर्ट करता है कि क्या गलत है, कब गलत है। और अगर मेरे पास अभी तक इसके लिए कोई चेक नहीं है, तो इसे बार-बार जांचने के लिए साधारण परीक्षण को जोड़ना सिर्फ एक मामला है।
  • यह मुझे निश्चित करता है कि मेरा कोड काम करता है अगर हम परीक्षण करने से पहले पास करते हैं। फिर मैं अपने नाखून खाने के बजाय एक केक खाने और कॉफ़ी पीने और अपने दोपहर का आनंद लेने के लिए गया।
  • जिन मामलों में आपको कुछ रिफ्लेक्टर करना है, उनमें उच्च स्तरीय परीक्षण बहुत अच्छे हैं। यदि मेरे मॉड्यूल को बाहरी दुनिया में कुछ कार्यक्षमता प्रदान करनी है और मैंने सही ढंग से काम करने के लिए कार्यात्मक / एकीकरण / ककड़ी परीक्षण विकसित किए हैं, तो मैं उस कोड से नरक को दूर करने के लिए बहुत बहादुर होऊंगा। कई बार मुझे उस कोड का सामना करना पड़ा जिसमें परीक्षण नहीं थे और इसे फिर से भरने की आवश्यकता थी। उस मामले में व्यवहार में जाने के दो तरीके थे। 1) कोड को ड्रॉप करें 2) परिवर्तनों को छोड़ें और इसे वैसे ही छोड़ दें।

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

अंत में, मैं बीडीडी शब्दों में सोचना पसंद करता हूं जो टीडीडी प्रथाओं पर निर्भर हैं। BDD मुझे डोमेन की शब्दावली का उपयोग करके समाधान को लागू करने और सॉफ़्टवेयर को समस्या को बेहतर बनाने के लिए बनाता है।


1

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

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


1
आप लगभग निश्चित रूप से इन समान गुणों को एक झरना प्रक्रिया द्वारा निर्मित कोड में पाएंगे, जैसे कि सैन्य, अंतरिक्ष, आदि के लिए। मुझे लगता है कि यह सच है कि वे चंचल और / या झरने के आधे-मिश्रित संस्करणों में आम नहीं हैं। रोजमर्रा की परियोजनाओं के लिए अधिकांश संगठन।
एरोनॉट

@Aaronaught बता दें कि मंगल क्लाइमेट ऑर्बिटर टीम को। :-)
एरिक किंग

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