12

में टेस्टेबल कोड कैसे लिखें, इसलिए मेरा यह प्रश्न तब शुरू हुआ जब मैंने postNotification और addObserver की एक साधारण 2 लाइन के लिए यूनिट परीक्षण करना शुरू किया। इस तरह के प्रश्न से here आप देख सकते हैं कि इसे टेस्ट करने योग्य बनाने के लिए आपको ~ 20 लाइन & को अपने कोड लिखने के सामान्य तरीके से दूर करने की आवश्यकता है।स्विफ्ट

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

मेरा प्रारंभिक विचार यह था कि मुझे 'कार्यात्मक प्रोग्रामिंग' का लक्ष्य रखना है और pure function तरीके से अपने कार्यों को लिखना है। लेकिन फिर फिर यह बहुत समय ले रहा है और मौजूदा कोडों में या फिर भी नई परियोजनाओं के लिए बहुत सी लाइनों के लिए बहुत से रिफैक्टरिंग की आवश्यकता हो सकती है और मुझे यह भी सुनिश्चित नहीं है कि that is the correct approach है। क्या एक आसान तरीके से टेस्टेबल कोड लिखने के लिए कोई सुझाए गए दिशानिर्देश या मानक हैं?

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

सभी परीक्षणों के लिए मुझे यह सुनिश्चित करना चाहिए कि मेरे परीक्षण पास हो जाएंगे और असफल हो जाएंगे जहां मैं असफल होने की उम्मीद करता हूं यानी विफल होने की उम्मीद होने पर परीक्षण पास होगा।

मुझे नहीं पता कि मैं प्रक्रिया को और अधिक आसान तरीके से कैसे सुगम बना सकता हूं।

मैं NSNotificationCenter के लिए एक टेस्टेबल कोड लिखने के लिए नहीं कह रहा हूं, मैं टेस्टेबल कोड लिखने के लिए सामान्य दिशानिर्देश मांग रहा हूं।

उत्तर

13

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

मैं कुछ स्विफ्ट विशिष्ट संसाधनों को नीचे लिंक करने के लिए अपना सर्वश्रेष्ठ प्रयास करूंगा ताकि मैं अपने कोड को टेस्ट करने योग्य बनाने के लिए अपने सामान्य सिद्धांतों का प्रदर्शन कर सकूं।

  1. अपना कोड टेस्टेबल बनाना अक्सर ध्वनि ऑब्जेक्ट उन्मुख डिजाइन सिद्धांतों का एक दुष्प्रभाव होता है।

    • आप the SOLID principles उपयोगी के बारे में पढ़ सकते हैं।
    • पांच SOLID सिद्धांतों में से प्रत्येक के this Swift based demonstration पर भी एक नज़र डालें।
    • Google's Code Reviewer's Guide (PDF) ठेठ ओओडी समस्याओं के बारे में सीखने और इससे बचने के लिए भी बहुत अच्छा संसाधन है (बिना किसी संयोग से, यह ओओडी संबंधित दस्तावेज उपशीर्षक "लेखन योग्य कोड" होता है)।
  2. ध्वनि ऑब्जेक्ट उन्मुख डिजाइन के बाद अक्सर उच्च स्तर के वास्तुशिल्प निर्णयों का दुष्प्रभाव होता है। असल में, प्रोग्राम के ऑब्जेक्ट ग्राफ़ में पेश करने की योजना के प्रकारों के बारे में जल्दी और अक्सर सोचें। उनके बीच भूमिकाएं और निर्भरता क्या हैं? क्या आपके ऑब्जेक्ट में कोई भी निर्भरता अलग-अलग संदर्भों से आपके कोड को निष्पादित करते समय मिलती है या सही तरीके से निर्माण करती है (उदा। यूआई कोड बनाम यूनिट टेस्ट से)?

    • आर्किटेक्चरल डिज़ाइन पैटर्न के बारे में बहुत सारे कंप्यूटर विज्ञान साहित्य हैं। The Gang of Four इस विषय के बारे में पढ़ने के लिए एक मूल्यवान पुस्तक बना हुआ है (हालांकि यह सब आपके विशिष्ट स्विफ्ट प्रोग्राम पर लागू नहीं होता है)।
    • स्विफ्ट में कितने सामान्य डिजाइन पैटर्न लागू किए जा सकते हैं, इस पर एक सिंहावलोकन के लिए इस Swift design patterns प्रदर्शन पर एक नज़र डालें।
    • विशेष रूप से यदि आपका कोड मोबाइल ऐप के लिए है, तो आपको read about VIPER होना चाहिए, मोबाइल ऐप उन्मुख आर्किटेक्चरल पैटर्न आईओएस ऐप्स की विशिष्ट वास्तुकला आवश्यकताओं से उभरा है।
    • ऊपर सूचीबद्ध सोलिड सिद्धांतों के लिए डिज़ाइन पैटर्न को लिंक करने के लिए, "एकल उत्तरदायित्व" सिद्धांत शायद एक सिद्धांत है जो कई बड़े कोको कार्यक्रमों में सबसे अधिक चमकदार रूप से उल्लंघन करता है जो खराब वास्तुशिल्प प्रथाओं का परिणाम है, जिसके परिणामस्वरूप कोड का परीक्षण करना बहुत कठिन होता है । वास्तव में लोग मजाक करने के लिए अक्सर एमवीसी को संदर्भित करते हैं क्योंकि कोको में "Massive View Controller" के रूप में अभ्यास में लागू होता है।

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

  • Use value types when you can: स्विफ्ट अच्छी तरह से प्रोग्राम जो स्वत: संदर्भ को कम से कम लेखन के लिए अनुकूल गिना संदर्भ (संकेत) है। इसमें प्रदर्शन लाभ होते हैं, लेकिन विश्वसनीय कोड लिखने की आपकी संभावनाओं में भी सुधार होता है जो अप्रत्याशित निर्भरताओं और डेटा दौड़ को कम करता है जो परीक्षण में कैप्चर करना मुश्किल हो सकता है।
  • Keep things immutable when you can: स्विफ्ट में वाक्यविन्यास सम्मेलन और प्रकार प्रणाली आपको म्यूटेबल राज्य से बचने में मदद करती है, जिसमें अन्य चीजों के साथ आपके कोड की टेस्टेबिलिटी पर नकारात्मक प्रभाव पड़ता है (परीक्षण के लिए आपके ऑब्जेक्ट ग्राफ़ को कॉन्फ़िगर करना मुश्किल हो सकता है, जैसा वास्तविक दुनिया उपयोग करने योग्य यदि आपके प्रोग्राम में संभावित राज्य स्थान बड़ा है तो अपने कोड का परीक्षण कवरेज)।
  • ऐप्पल ने the architectural matter of value types and immutability पर कुछ मार्गदर्शन भी उपलब्ध कराए हैं जो आपके कोड की टेस्टेबिलिटी पर भी छूता है।
  • प्रोटोकॉल का उपयोग करें जब आप कर सकते हैं: समझने के लिए, the Liskov substitution principle :-) पर क्यों पढ़ा जाए, गंभीरता से, कंक्रीट प्रकारों पर प्रोटोकॉल पसंद करते हुए आपको उदाहरण के लिए टेस्ट करने योग्य कोड लिखने में मदद मिलती है ताकि आप टेस्ट विशिष्ट प्रकारों के साथ परीक्षण सेटिंग में निर्भरताओं को पूरा कर सकें नकली या नकली कुछ संसाधन आपके परीक्षणों के लिए अप्रासंगिक हैं।
  • कार्यात्मक प्रोग्रामिंग तकनीकों का उपयोग करें (जब यह समझ में आता है): फ़ंक्शंस के साथ अक्सर कार्यक्षमता को लिखने में आपको पठनीय, लचीला कोड लिखने में मदद मिलती है जो उत्परिवर्तनीय स्थिति से बचाती है।स्विफ्ट में कार्यात्मक पैटर्न लगाने के लिए मैं एक अच्छी गाइड के रूप में Functional Swift by Chris Eidhof and others की सलाह देता हूं।

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

+0

मुझे लिंक के माध्यम से जाना होगा। इसमें थोड़ा वक्त लगेगा। क्या आप परीक्षण के लिए एक खराब कोड का उदाहरण दे सकते हैं और अच्छे कोड के लिए एक और परीक्षण कर सकते हैं और यह भी उल्लेख कर सकते हैं कि हमें मॉकिंग को आसान बनाना चाहिए? – Honey

+1

मैं यह समझने के लिए कुछ और विस्तार में अपनी प्रतिक्रिया के माध्यम से पढ़ने का सुझाव दूंगा कि यह क्यों है कि मैं आपको एक बुरे और अच्छे उदाहरण के साथ पेश नहीं करूंगा (मैं आपको एक संकेत दूंगा, आप समस्या को अधिक बढ़ा रहे हैं) :-) तो, मैं सुझाव है कि आप पृष्ठभूमि पढ़ते हैं - इस मामले पर कौशल और अनुभव धोखा देने का कोई तरीका नहीं है। – mz2

+0

ठोस के लिए आपका पहला लिंक इसके अंत में '' 'गायब है। मैंने लिंक के माध्यम से पढ़ा और विश्वास किया कि आप मुझे लिखने के मार्ग में मार्गदर्शन कर रहे हैं। क्या आप सटीक रूप से यह निर्धारित कर सकते हैं कि आपको पोस्ट यूनिटेशन, AddObserver का पता लगाने वाले पते इकाई को क्या करना है। क्या कोई लिंक पता है? मेरी चिंता का समाधान करते हुए, मैंने पहले ही अपने प्रश्न में एक लिंक शामिल किया है। पीएस मुझे लगता है कि स्विफ्ट डिजाइन पैटर्न लिंक मुझे कुछ समय के लिए व्यस्त रखेगा – Honey