2008-09-28 5 views
36

जैसा कि आप एक विरासत कोडेबेस में काम करते हैं, उस समय के साथ सबसे बड़ा प्रभाव क्या होगा जो कोडबेस की गुणवत्ता में सुधार करेगा?एक विरासत कोडेबेस के साथ आप क्या कर सकते हैं जिसका गुणवत्ता सुधारने पर सबसे बड़ा असर होगा?

  • परीक्षण कवरेज में सुधार करने के लिए जहां कवरेज कम है
  • फ़ाइलों में सतत प्रारूपण
  • अद्यतन 3 पार्टी सॉफ्टवेयर
  • कम उत्पन्न चेतावनी बनाएं अप्रयुक्त कोड
  • निकालें दोहराया कोड
  • जोड़ें इकाई परीक्षण निकालें स्थिर विश्लेषण उपकरण (यानी फाइंडबग) द्वारा

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

उत्तर

33

यह एक महान किताब है।

आपको लगता है कि इस सवाल का जवाब पसंद नहीं है, तो सबसे अच्छा सलाह मैं दे सकते हैं होगा:

  • पहले, नई विरासत कोड [1]

[1] बनाने बंद: विरासत कोड = कोड यूनिट परीक्षण के बिना और इसलिए एक अज्ञात

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

नोट: मैं यह नहीं कह रहा हूं कि आपको सब कुछ रोकने और सप्ताहों में सब कुछ के लिए परीक्षण लिखने की आवश्यकता है। इसके विपरीत, बस उन क्षेत्रों के आसपास परीक्षण करें जिन्हें आपको परीक्षण करने और वहां से काम करने की आवश्यकता है। के रूप में मैं वर्तमान में मेरी गोद में से एक 'उन' पुराने स्कूल codebase में है http://www.lostechies.com/blogs/jimmy_bogard/archive/2008/05/06/pablotv-eliminating-static-dependencies-screencast.aspx

5

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

3

मैं इस सवाल से संबंधित कर सकते हैं:

जिमी Bogard और रे ह्यूस्टन बहुत ही इस के लिए इसी तरह एक विषय पर एक दिलचस्प स्क्रीन कास्ट किया था। यह वास्तव में विरासत नहीं है लेकिन यह निश्चित रूप से वर्षों की प्रवृत्ति का पालन नहीं करता है।

मैं आप चीजों को बता दूँगा मैं वे मुझे बग के रूप में हर दिन उस में ठीक करने के लिए प्यार होता है: इनपुट और आउटपुट चर

  • Refactor चर नाम

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

    शेष वास्तव में मूंगफली है। विरासत कोडेबेस के साथ ये मुख्य समस्याएं हैं, वे वास्तव में बहुत समय खाते हैं।

  • 6

    परीक्षण कवरेज में सुधार के लिए यूनिट परीक्षण जोड़ें। अच्छा परीक्षण कवरेज होने से आपको डर के बिना कार्यक्षमता को सुधारने और सुधारने की अनुमति मिल जाएगी।

    सीपीपीयूनीट, Working Effectively with Legacy Code के लेखक द्वारा लिखित इस पर एक अच्छी किताब है।

    विरासत कोड में परीक्षण जोड़ना उन्हें स्क्रैच से बनाने से प्रमाणित रूप से अधिक चुनौतीपूर्ण है। सबसे अधिक उपयोगी अवधारणा मैं किताब से दूर ले जाया गया है "संधियों" की धारणा है, जो पंख

    रूप में परिभाषित करता है "एक जगह है जहाँ आप उस जगह में संपादन के बिना अपने कार्यक्रम में व्यवहार में परिवर्तन कर सकते हैं।"

    कभी-कभी इसके लायक रिफैक्टरिंग तेजी है कि भविष्य परीक्षण आसान हो जाएगा बनाने के लिए (पहली जगह में या संभव।) google testing blog, विषय पर बहुत सी रोचक पोस्ट है ज्यादातर Dependency Injection की प्रक्रिया से संबद्ध।

    +0

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

    2

    मैं कहना चाहता हूँ यह काफी हद तक है कि तुम क्या विरासत कोड के साथ क्या करना चाहते हैं पर निर्भर करता है ...

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

    यदि यह ठीक काम नहीं कर रहा है, तो अप्रयुक्त कोड को हटाकर और डुप्लिकेट कोड को पुन: सक्रिय करने से डीबगिंग बहुत आसान हो जाएगी। हालांकि, मैं केवल इन परिवर्तनों को गड़बड़ कोड पर ही कर दूंगा।

    आप संस्करण 2.0 पर योजना है, इकाई परीक्षण जोड़ सकते हैं और कोड को साफ आप आगे

    2

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

    अच्छा प्रलेखन मूल लेखक को समझने, ठीक करने और यहां तक ​​कि खराब कोड को विस्तारित करने की अनुमति देता है। मैं हैक किए गए अभी तक अच्छी तरह से प्रलेखित कोड ले जाऊंगा जिसे मैं सप्ताह के किसी भी दिन सही लेकिन अचूक कोड पर समझ सकता हूं।

    +0

    यूनिट परीक्षण दस्तावेज हैं, समस्या यह है कि विरासत कोड (जैसा कि एम फेदर इसे परिभाषित करता है "प्रभावी रूप से कार्य करना विरासत संहिता ") में उनके पास नहीं है। –

    20

    मैं लगभग 50 प्रोग्रामर द्वारा लिखित और संशोधित एक विरासत 1 एम LOC आवेदन के साथ काम करता हूं।

    * Remove unused code 
    

    लगभग बेकार ... बस इसे अनदेखा करें। आपको उस से निवेश पर एक बड़ा रिटर्न (आरओआई) नहीं मिलेगा।

    * Remove duplicated code 
    

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

    * Add unit tests to improve test coverage where coverage is low 
    

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

    * Create consistent formatting across files 
    

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

    * Update 3rd party software 
    

    ऐसा केवल तभी करें जब नई वास्तव में अच्छी सुविधा है या आपके पास जो संस्करण है, वह नए ऑपरेटिंग सिस्टम द्वारा समर्थित नहीं है।

    * Reduce warnings generated by static analysis tools 
    

    यह इसके लायक हो सकता है। कभी-कभी चेतावनी संभावित बग को छुपा सकती है।

    1

    विरासत कोड के साथ मैंने जो भी सबसे बड़ी चीज की है, उसके साथ एक असली एपीआई बनाना है। यह 1 9 70 की स्टाइल कोबोल एपीआई है जिसे मैंने एक .NET ऑब्जेक्ट मॉडल बनाया है, ताकि सभी असुरक्षित कोड एक ही स्थान पर हों, एपीआई के मूल डेटा प्रकारों और .NET डेटा प्रकारों के बीच सभी अनुवाद एक ही स्थान पर हैं, प्राथमिक विधियां डेटासेट्स को वापस लेती हैं और स्वीकार करती हैं, और इसी तरह।

    यह सही करने के लिए बेहद मुश्किल था, और इसमें अभी भी कुछ दोष हैं जिन्हें मैं जानता हूं। यह या तो सभी marshalling पर चल रहा है, या तो भयानक रूप से कुशल नहीं है। लेकिन दूसरी तरफ, मैं डेटाग्रिड व्यू का निर्माण कर सकता हूं जो कि 15-वर्षीय एप्लिकेशन के लिए राउंड-ट्रिप डेटा जो लगभग आधे घंटे में Btrieve (!) में अपना डेटा जारी रखता है, और यह काम करता है। जब ग्राहक परियोजनाओं के साथ मेरे पास आते हैं, तो मेरे अनुमान महीनों और वर्षों के बजाय दिन और सप्ताह में होते हैं।

    1

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

    1

    मैं कहूंगा कि इसे अधिकांश भाग के लिए छोड़ दें। यदि यह टूटा नहीं है तो इसे ठीक न करें। यदि यह टूटा हुआ है तो आगे बढ़ें और टूटे हुए कोड के हिस्से को ठीक करें और सुधारें और इसके तुरंत कोड को ठीक करें। आप उस हिस्से को बेहतर बनाने के प्रयास और व्यय को न्यायसंगत बनाने के लिए बग या गंभीर रूप से अनुपलब्ध सुविधा के दर्द का उपयोग कर सकते हैं।

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

    यदि आपको कुछ ठीक करने का मौका मिलता है, तो इसे सही करें (इसे सही करने का मौका पहली बार हो सकता है, लेकिन जब से आप उस हिस्से को फिर से छू रहे हैं तो यह सही समय पर भी हो सकता है) और इसमें आपके द्वारा उल्लेखित सभी आइटम शामिल हैं।

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

    1

    पार्टी के लिए देर हो चुकी है, लेकिन जहां एक समारोह/विधि का इस्तेमाल किया या अक्सर संदर्भित है निम्नलिखित कर रही लायक हो सकता है:

    • स्थानीय चर अक्सर खराब विरासत कोड में नाम हो जाते हैं (अक्सर अपने दायरे के कारण एक विधि संशोधित होने पर विस्तार करना, और इसे प्रतिबिंबित करने के लिए अद्यतन नहीं किया जा रहा है)। अपने वास्तविक उद्देश्य के साथ इन्हें नामांकित करने से विरासत कोड को स्पष्ट करने में मदद मिल सकती है।
    • यहां तक ​​कि विधि को थोड़ा अलग तरीके से डालने से आश्चर्यजनक काम हो सकते हैं - उदाहरण के लिए, एक पंक्ति पर if के सभी खंड डालें।
    • वहां पहले से ही पुरानी/भ्रमित कोड टिप्पणियां हो सकती हैं। अगर उन्हें जरूरत नहीं है तो उन्हें हटा दें, या अगर आपको पूरी तरह से संशोधन करना है तो उन्हें संशोधित करें। (बेशक, मैं उपयोगी टिप्पणियों को हटाने, की वकालत नहीं कर रहा हूँ बस उन है कि एक बाधा है।)

    ये बड़े पैमाने पर शीर्षक प्रभाव आप देख रहे हैं नहीं हो सकता है, लेकिन वे कम जोखिम कर रहे हैं, खासकर यदि कोड यूनिट परीक्षण नहीं किया जा सकता है।

    संबंधित मुद्दे

     संबंधित मुद्दे