मैंने पुस्तक को प्रभावी ढंग से लिगेसी कोड के साथ कार्य करते हुए देखा है । इस पुस्तक के मुख्य बिंदु क्या हैं?
क्या यूनिट / एकीकरण परीक्षणों को जोड़ने और फिर रिफैक्टरिंग की तुलना में विरासत कोड से निपटने के लिए बहुत कुछ है?
मैंने पुस्तक को प्रभावी ढंग से लिगेसी कोड के साथ कार्य करते हुए देखा है । इस पुस्तक के मुख्य बिंदु क्या हैं?
क्या यूनिट / एकीकरण परीक्षणों को जोड़ने और फिर रिफैक्टरिंग की तुलना में विरासत कोड से निपटने के लिए बहुत कुछ है?
जवाबों:
विरासत कोड के साथ महत्वपूर्ण समस्या यह है कि इसका कोई परीक्षण नहीं है। तो आपको कुछ (और फिर और ...) जोड़ने की आवश्यकता है।
@Mattnz ने कहा कि यह अपने आप में बहुत काम लेगा। लेकिन विरासत कोड की विशेष समस्या यह है कि इसे कभी भी परीक्षण योग्य नहीं बनाया गया था । इसलिए आमतौर पर यह स्पेगेटी कोड की एक बड़ी जटिल गड़बड़ है, जहां छोटे भागों को इकाई परीक्षण के लिए अलग करना बहुत मुश्किल या बिल्कुल असंभव है। इसलिए यूनिट परीक्षण से पहले, आपको इसे और अधिक परीक्षण योग्य बनाने के लिए कोड को रीफैक्टर करने की आवश्यकता है ।
हालाँकि, सुरक्षित रूप से रिफ्लेक्टर करने के लिए, आपके पास यह सत्यापित करने के लिए इकाई परीक्षण होना चाहिए कि आपने अपने परिवर्तनों के साथ कुछ नहीं तोड़ा है ... यह विरासत कोड का कैच 22 है।
पुस्तक आपको सिखाती है कि पहली इकाई परीक्षणों को सक्षम करने के लिए कोड में पूर्ण न्यूनतम, सबसे सुरक्षित बदलाव करके इस कैच को कैसे खत्म किया जाए। ये डिज़ाइन को अच्छा बनाने के लिए नहीं हैं - केवल यूनिट परीक्षणों को सक्षम करने के लिए। वास्तव में, कभी-कभी वे डिजाइन को बदसूरत या अधिक जटिल बनाते हैं। हालांकि, वे आपको परीक्षण लिखने की अनुमति देते हैं - और एक बार आपके पास इकाई परीक्षण होने के बाद, आप डिज़ाइन को बेहतर बनाने के लिए स्वतंत्र हैं।
कोड को परीक्षण योग्य बनाने के लिए बहुत सारी तरकीबें हैं - कुछ स्पष्ट हैं, कुछ बिल्कुल नहीं हैं। ऐसी विधियाँ हैं जिनके बारे में मैंने कभी किताब पढ़े बिना अपने बारे में नहीं सोचा होगा। लेकिन जो और भी महत्वपूर्ण है वह यह है कि पंख बताते हैं कि क्या वास्तव में एक कोड इकाई को परीक्षण योग्य बनाता है। आपको निर्भरता में कटौती करने और अपने कोड में बाधाओं को लागू करने की आवश्यकता है, लेकिन दो अलग-अलग कारणों से:
सुरक्षित रूप से काटना निर्भरता मुश्किल हो सकता है। परिचय इंटरफेस, मॉक और डिपेंडेंसी इंजेक्शन एक लक्ष्य के रूप में साफ और अच्छा है, बस जरूरी नहीं कि इस बिंदु पर करना सुरक्षित हो। इसलिए कभी-कभी हमें किसी विधि को ओवरराइड करने के लिए परीक्षण के तहत वर्ग को उपवर्ग में करने का सहारा लेना पड़ता है जो आमतौर पर एक DB के लिए एक सीधा अनुरोध शुरू करता है। अन्य बार, हमें परीक्षण वातावरण में एक निर्भरता वर्ग / जार को एक नकली के साथ बदलने की आवश्यकता हो सकती है ...
मेरे लिए, पंख द्वारा लाई गई सबसे महत्वपूर्ण अवधारणा सीम है । सीम कोड में एक जगह है जहां आप अपने प्रोग्राम के व्यवहार को कोड को संशोधित किए बिना बदल सकते हैं । आपके कोड में सीम का निर्माण परीक्षण के तहत कोड के टुकड़े को अलग करने में सक्षम बनाता है , लेकिन यह आपको परीक्षण के तहत कोड के व्यवहार को भी महसूस करने में सक्षम बनाता है , भले ही यह सीधे करना मुश्किल या असंभव हो (जैसे क्योंकि कॉल किसी अन्य ऑब्जेक्ट या सबसिस्टम में परिवर्तन करता है। , जिसका राज्य परीक्षण विधि से सीधे क्वेरी करना संभव नहीं है)।
यह ज्ञान आपको कोड के सबसे नास्तिक ढेर में परीक्षण क्षमता के बीज को नोटिस करने की अनुमति देता है, और वहां पहुंचने के लिए न्यूनतम, कम से कम विघटनकारी, सबसे सुरक्षित परिवर्तन ढूंढता है। दूसरे शब्दों में, "स्पष्ट" रिफ्लेक्टरिंग करने से बचने के लिए, जो आपके बिना कोड को तोड़ने का जोखिम रखते हैं - क्योंकि आपके पास अभी तक इसका पता लगाने के लिए यूनिट परीक्षण नहीं हैं।
विरासत कोड के साथ प्रभावी ढंग से काम करने के प्रमुख बिंदुओं को प्राप्त करने के त्वरित तरीके
मैं कोड की लाखों पंक्तियों के एक कोड आधार पर काम करता हूं, कुछ 1980 के दशक में वापस डेटिंग करते हैं। यह सिर्फ सॉफ्टवेयर है, इसलिए यह केवल कुछ यूनिट परीक्षणों को लिखने की बात है, इसलिए आप जा सकते हैं और बस इसे रिफैक्ट कर सकते हैं, और इसे बहुत बेहतर बना सकते हैं।
यहाँ मुख्य शब्द बस है - यह एक चार-अक्षर वाला शब्द है जो किसी भी प्रोग्रामर की शब्दावली में नहीं है, केवल एक है जो विरासत प्रणालियों पर काम कर रहा है।
एक घंटे के विकास के प्रयास का परीक्षण करने के लिए, आपको इकाई परीक्षण लिखने में कितना समय लगता है? चर्चा के लिए, चलो एक और घंटे कहते हैं।
उस मिलियन-लाइन, 20-वर्षीय विरासत प्रणाली में कितना समय निवेश किया जाता है? मान लीजिए, 20 डेवलपर्स 20 साल के लिए 2000 घंटे / वर्ष (उन्होंने बहुत मेहनत की)। आइए अब एक नंबर चुनें - आपके पास नए कंप्यूटर और नए उपकरण हैं, और आप उन लोगों की तुलना में बहुत अधिक चतुर हैं जिन्होंने पहली बार में $ ^ ^ ^ का यह टुकड़ा लिखा है - मान लीजिए कि आप उनमें से 10 लायक हैं। क्या आपको 40 आदमी साल मिले हैं, ठीक है, आपके पास ...?
तो आपके प्रश्न का उत्तर और भी बहुत कुछ है। उदाहरण के लिए, वह दिनचर्या जो १००० पंक्तियाँ हैं (मेरे पास कुछ ऐसी हैं जो ५००० से अधिक हैं), यह अत्यधिक जटिल है और यह स्प्रैडशीट का एक टुकड़ा है। यह केवल (अभी तक एक और चार अक्षर शब्द) कुछ 100 लाइन दिनचर्या और कुछ और 20 लाइनों सहायकों में इसे फिर से कारक करने के लिए कुछ दिन लेगा, है ना? गलत। उन 1000 लाइनों में छिपा हुआ है 100 बग फिक्स, प्रत्येक एक अनिर्दिष्ट उपयोगकर्ता की आवश्यकता या एक अस्पष्ट किनारे का मामला। यह 1000 लाइनें है क्योंकि मूल 100-लाइन दिनचर्या ने काम नहीं किया।
आपको मन सेट के साथ काम करने की आवश्यकता है " अगर यह टूट नहीं गया है, तो इसे ठीक न करें "। जब इसे तोड़ दिया जाता है, तो आपको इसे ठीक करते समय बहुत सावधानी बरतने की आवश्यकता होती है - जैसा कि आप इसे बेहतर बनाते हैं, कि आप गलती से कुछ और नहीं बदलते हैं। ध्यान दें कि "टूट गया" में कोड शामिल हो सकता है जो अचूक है, लेकिन सही तरीके से काम कर रहा है, जो सिस्टम और इसके उपयोग पर निर्भर करता है। पूछें "क्या होता है अगर मैं इसे खराब कर देता हूं और इसे बदतर बना देता हूं", क्योंकि एक दिन आप करेंगे, और आपको मालिकों के बॉस को बताना होगा कि आपने ऐसा क्यों चुना।
इन प्रणालियों को हमेशा बेहतर बनाया जा सकता है। आपके पास काम करने के लिए एक बजट होगा, एक समयरेखा, जो भी हो। यदि आप नहीं करते - जाओ और एक बनाओ। जब पैसा / समय समाप्त हो गया है तो इसे बेहतर बनाना बंद करें। एक सुविधा जोड़ें, अपने आप को इसे थोड़ा बेहतर बनाने के लिए समय दें। बग को ठीक करें - फिर से, थोड़ा अतिरिक्त समय व्यतीत करें और इसे बेहतर बनाएं। जब आपने शुरू किया था तो इसे कभी भी इससे ज्यादा खराब न करें।
पुस्तक से दूर ले जाने के लिए दो प्रमुख बिंदु हैं।
जैसा कि अन्य उत्तरदाताओं ने बताया है, अपने मौजूदा विरासत कोड को पूर्व-खाली करने की कोशिश करना एक मूर्खता है । इसके बजाय, जब भी आपको विरासत कोड (एक नई सुविधा या बग फिक्स के लिए) में कोई बदलाव करना हो, तो उसकी विरासत की स्थिति को हटाने के लिए समय निकालें।