TDD का उपयोग करके प्रारंभिक API अधिकार कैसे प्राप्त करें?


12

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

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

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


3
एक विधि पर 30 परीक्षण? ऐसा लगता है कि इस पद्धति में बहुत अधिक जटिलता है, या आप बहुत सारे परीक्षण लिख रहे हैं।
20

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

6
@ मिन्थोस: मैं अपने सिर के ऊपर से 6 परीक्षणों के बारे में सोच सकता हूं कि एक स्ट्रिंग लेने वाला कोई भी तरीका अक्सर विफल हो जाएगा या पहले ड्राफ्ट लिखने के खिलाफ खराब प्रदर्शन करेगा (अशक्त, खाली, बहुत लंबा, ठीक से स्थानीयकृत नहीं, खराब पूर्ण स्केलिंग) । इसी तरह संग्रह लेने के तरीकों के लिए। गैर-तुच्छ पद्धति के लिए, 30 बड़ी लगती हैं, लेकिन बहुत अधिक अवास्तविक नहीं।
स्टीवन एवर्स

जवाबों:


13

जिसे आप "बड़ा डिज़ाइन अप फ्रंट" कहते हैं, " मैं आपकी क्लास आर्किटेक्चर की समझदार योजना" कहता हूं

आप इकाई परीक्षणों से एक वास्तुकला विकसित नहीं कर सकते। यहां तक ​​कि अंकल बॉब भी यही कहते हैं।

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

http://s3.amazonaws.com/hanselminutes/hanselminutes_0171.pdf , पृष्ठ 4

मुझे लगता है कि आपके संरचनात्मक डिजाइन को मान्य करने के दृष्टिकोण से टीडीडी से संपर्क करना अधिक समझदारी होगी । यदि आप इसका परीक्षण नहीं करते हैं तो आप कैसे जानते हैं कि डिज़ाइन गलत है? और आप कैसे सत्यापित करते हैं कि मूल परिवर्तनों को भी बदले बिना आपके परिवर्तन सही हैं?

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


बात यह है कि "समझदार योजना" के साथ, आप इसे बदलने के लिए बहुत उम्मीद करते हैं। मैं आमतौर पर अपने शुरुआती आर्किटेक्चर का लगभग 80% बीच में कुछ बदलावों के साथ छोड़ देता हूं। वे 20% जो मुझे परेशान कर रहे हैं।
व्याप्तस मैकॉनिस

2
मुझे लगता है कि यह केवल सॉफ्टवेयर विकास की प्रकृति है। आप पहले प्रयास में ही पूरी वास्तुकला को प्राप्त करने की उम्मीद नहीं कर सकते।
रॉबर्ट हार्वे

2
+1, और यह TDD के लिए काउंटर नहीं है। TDD तब शुरू होता है जब आप कोड लिखना शुरू करते हैं, ठीक जब डिजाइन समाप्त होता है। टीडीडी आपको यह देखने में मदद कर सकता है कि आपने अपने डिज़ाइन में क्या कमी की है, जिससे आप डिज़ाइन और कार्यान्वयन को रिफैक्ट कर सकते हैं और जारी रख सकते हैं।
स्टीवन एवर्स

2
वास्तव में बॉब के अनुसार (और मैं उनसे पूरी ईमानदारी से सहमत हूं) लेखन कोड डिजाइन भी है। उच्च स्तर की वास्तुकला होना निश्चित रूप से आवश्यक है लेकिन जब आप अपना कोड लिखते हैं तो डिज़ाइन समाप्त नहीं होता है।
माइकल ब्राउन

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

3

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

आप अपने लाल-हरे-परावर्तक चक्र में 30 गुना लाल को अनदेखा नहीं कर सकते हैं?

आपके परीक्षणों को आपके उत्पादन कोड के साथ-साथ पुन: सक्रिय किया जाना चाहिए। यदि आप कर सकते हैं, तो प्रत्येक परिवर्तन के बाद सभी परीक्षणों को फिर से चलाएं।

TDD परीक्षणों को हटाने से डरो मत। कुछ परीक्षण वांछित परिणाम प्राप्त करने के लिए परीक्षण बिल्डिंग ब्लॉकों को समाप्त करते हैं। एक कार्यात्मक स्तर पर वांछित परिणाम वह है जो मायने रखता है। आपके द्वारा चुने गए एल्गोरिथम में इंटरमीडिएट चरणों के आस-पास परीक्षण / आविष्कार किया गया हो सकता है या बहुत अधिक मूल्य का नहीं हो सकता है जब परिणाम तक पहुंचने का एक तरीका है या आप शुरू में एक मृत-अंत में भाग गए।

कभी-कभी आप कुछ सभ्य एकीकरण परीक्षण बना सकते हैं, उन्हें रख सकते हैं और बाकी को हटा सकते हैं। यह कुछ हद तक निर्भर करता है कि आप अंदर या बाहर काम करते हैं या आप कितने बड़े कदम उठाते हैं।


1

जैसा कि रॉबर्ट हार्वे ने कहा था, आप शायद किसी ऐसी चीज़ के लिए टीडीडी का इस्तेमाल करने की कोशिश कर रहे हैं, जिसे एक अलग वैचारिक उपकरण द्वारा नियंत्रित किया जाना चाहिए (वह है: "डिज़ाइन" या "मॉडलिंग")।

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

इस साधारण सार्वजनिक इंटरफ़ेस को मानते हुए अपने परीक्षण लिखें।

जब भी आवश्यकता हो अपनी कक्षाओं और तरीकों के आंतरिक व्यवहार को बदलें।

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

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

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


0

मैं इसे उपयोगकर्ता के दृष्टिकोण से देखता हूं। उदाहरण के लिए, यदि आपके एपीआई ने मुझे नाम और उम्र के साथ एक व्यक्ति वस्तु बनाने की अनुमति दी है, तो बेहतर था कि नाम और उम्र के लिए एक व्यक्ति (स्ट्रिंग नाम, इंट युग) कंस्ट्रक्टर और एक्सेसर विधियां हों। नाम और उम्र के साथ और बिना नए व्यक्तियों के लिए परीक्षण मामलों को बनाना सरल है।

डौग

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.