विरासत कोड के साथ प्रभावी रूप से कार्य करने के प्रमुख बिंदु क्या हैं? [बन्द है]


133

मैंने पुस्तक को प्रभावी ढंग से लिगेसी कोड के साथ कार्य करते हुए देखा है । इस पुस्तक के मुख्य बिंदु क्या हैं?

क्या यूनिट / एकीकरण परीक्षणों को जोड़ने और फिर रिफैक्टरिंग की तुलना में विरासत कोड से निपटने के लिए बहुत कुछ है?



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

9
शायद आपको सिर्फ किताब पढ़ना चाहिए
HLGEM

यहां अच्छी समीक्षा: andreaangella.com/2014/03/...
rohancragg

जवाबों:


157

विरासत कोड के साथ महत्वपूर्ण समस्या यह है कि इसका कोई परीक्षण नहीं है। तो आपको कुछ (और फिर और ...) जोड़ने की आवश्यकता है।

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

हालाँकि, सुरक्षित रूप से रिफ्लेक्टर करने के लिए, आपके पास यह सत्यापित करने के लिए इकाई परीक्षण होना चाहिए कि आपने अपने परिवर्तनों के साथ कुछ नहीं तोड़ा है ... यह विरासत कोड का कैच 22 है।

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

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

  • संवेदन - कोड के एक टुकड़े को निष्पादित करने के प्रभावों की जांच करने और सत्यापित करने के लिए, और
  • पृथक्करण - सबसे पहले कोड के विशिष्ट टुकड़े को एक परीक्षण दोहन में लाने के लिए।

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

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

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


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

99

विरासत कोड के साथ प्रभावी ढंग से काम करने के प्रमुख बिंदुओं को प्राप्त करने के त्वरित तरीके


3
उस हंसेलमिन्यूट्स पृष्ठ पर एमपी 3 लिंक टूटा हुआ है, लेकिन hanselminutes.com/165/… पर एक नहीं है - s3.amazonaws.com/hanselminutes/hanselminutes_0165.mp3
पीटर मोर्टेंसन

धन्यवाद PDF लिंक को ठीक करने के लिए rosston। लगता है कि objectmentor.com चला गया है - शायद "अंकल बॉब" व्यापार से बाहर चला गया है?
मार्कजे

मुझे यकीन नहीं है कि ऑब्जेक्ट मेंटर के लिए क्या हुआ है, लेकिन इन दिनों अंकल बॉब 7 वें लाइट के लिए काम करते हैं।
जूल्स

40

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

यहाँ मुख्य शब्द बस है - यह एक चार-अक्षर वाला शब्द है जो किसी भी प्रोग्रामर की शब्दावली में नहीं है, केवल एक है जो विरासत प्रणालियों पर काम कर रहा है।

एक घंटे के विकास के प्रयास का परीक्षण करने के लिए, आपको इकाई परीक्षण लिखने में कितना समय लगता है? चर्चा के लिए, चलो एक और घंटे कहते हैं।

उस मिलियन-लाइन, 20-वर्षीय विरासत प्रणाली में कितना समय निवेश किया जाता है? मान लीजिए, 20 डेवलपर्स 20 साल के लिए 2000 घंटे / वर्ष (उन्होंने बहुत मेहनत की)। आइए अब एक नंबर चुनें - आपके पास नए कंप्यूटर और नए उपकरण हैं, और आप उन लोगों की तुलना में बहुत अधिक चतुर हैं जिन्होंने पहली बार में $ ^ ^ ^ का यह टुकड़ा लिखा है - मान लीजिए कि आप उनमें से 10 लायक हैं। क्या आपको 40 आदमी साल मिले हैं, ठीक है, आपके पास ...?

तो आपके प्रश्न का उत्तर और भी बहुत कुछ है। उदाहरण के लिए, वह दिनचर्या जो १००० पंक्तियाँ हैं (मेरे पास कुछ ऐसी हैं जो ५००० से अधिक हैं), यह अत्यधिक जटिल है और यह स्प्रैडशीट का एक टुकड़ा है। यह केवल (अभी तक एक और चार अक्षर शब्द) कुछ 100 लाइन दिनचर्या और कुछ और 20 लाइनों सहायकों में इसे फिर से कारक करने के लिए कुछ दिन लेगा, है ना? गलत। उन 1000 लाइनों में छिपा हुआ है 100 बग फिक्स, प्रत्येक एक अनिर्दिष्ट उपयोगकर्ता की आवश्यकता या एक अस्पष्ट किनारे का मामला। यह 1000 लाइनें है क्योंकि मूल 100-लाइन दिनचर्या ने काम नहीं किया।

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

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


2
सुझावों के लिए धन्यवाद! ये तुम्हारे हैं या किताब से?
आर्मंड

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

7
"यह 1000 के दशक का है क्योंकि मूल 100लाइन दिनचर्या ने काम नहीं किया।" ऐसा बहुत कम ही होता है जो वास्तव में ऐसा हो। अधिक बार यह 1,000 लाइनों से नहीं होता है क्योंकि मूल डेवलपर ने अपनी आस्तीन को घुमाया और योजना या डिजाइन के लिए एक पल भी नहीं बख्शा।
स्टीफन टॉसेट

3
नहीं। मैं कह रहा हूं कि अधिकांश मामलों में (मैं व्यक्तिगत रूप से सामना कर चुका हूं), 1,000 लाइन रूटीन स्पष्ट संकेत हैं कि लोगों ने उचित अमूर्त लिखने के बारे में सोचने से पहले कोड लिखना शुरू कर दिया। हजारों लाइन रूट वस्तुतः परिभाषा से बहुत जटिल हैं - क्या आप कह रहे हैं कि एक हजार लाइन रूटीन, जिसमें सैकड़ों छिपे हुए, अनियोजित बगफिक्स एक जिम्मेदार डेवलपर की पहचान है?
स्टीफन टॉसेट

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

19

पुस्तक से दूर ले जाने के लिए दो प्रमुख बिंदु हैं।

  1. लिगेसी कोड कोई भी कोड होता है जिसमें टेस्ट कवरेज नहीं होता है।
  2. जब भी आपको विरासत कोड बदलना हो, तो आपको यह सुनिश्चित करना चाहिए कि इसमें कवरेज हो।

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


6
+1 उत्कृष्ट बिंदु: "जब भी आपको विरासत कोड में बदलाव करना हो, तो इसकी विरासत स्थिति को हटाने के लिए समय निकालें।"
जॉन

3
विरासत की स्थिति को हटाते हुए, मेरा वोट प्राप्त करें :)
राहेल

7

एक अखरोट के खोल में यह सच है - परीक्षण जोड़ना और रीफैक्टरिंग यह सब क्या है।

लेकिन पुस्तक आपको कोड के साथ ऐसा करने के लिए कई अलग-अलग तकनीकें देती है जो कि सुरक्षित रूप से परीक्षण और रिफ्लेक्टर करने के लिए बहुत मुश्किल है।

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