एक विरासत कोडबेस में, मैं कैसे जल्दी से पता लगा सकता हूं कि क्या उपयोग किया जा रहा है और क्या नहीं है?


21

मुझे यह मूल्यांकन करने के लिए कहा गया है कि एक पर्याप्त विरासत कोडबेस के रूप में प्रतीत होता है, उस कोडबेस को बनाए रखने वाले अनुबंध को लेने के लिए एक अग्रदूत के रूप में।

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

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

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

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

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


7
मुझे फ्लैश के बारे में पर्याप्त जानकारी नहीं है लेकिन अगर कोड नहीं होने पर आपको संकलन त्रुटियां मिलती हैं, तो आपको यह देखने के लिए फ़ोल्डर का नाम बदलने में सक्षम होना चाहिए कि क्या वे संदर्भित हैं।
ऊद

बुराई समाधान: उन्हें हटा दें और त्रुटियों / बग रिपोर्ट की प्रतीक्षा करें। (बस यह सुनिश्चित करें कि यह पुनर्प्राप्त करने योग्य है!)
इज़काता

1
@ क्या आप स्पष्ट कर सकते हैं कि यदि आप अनुबंध के अगले चरण के हिस्से के रूप में मूल्यांकन के लिए भुगतान किए जा रहे हैं जो आपको अभी भी / अन्यथा प्राप्त करना है? आपका उत्तर "एक उपकरण है" प्रश्न को नहीं बदलेगा, लेकिन हम में से कुछ जवाब फिर से तैयार कर सकते हैं: प्रक्रिया जो आपकी स्थिति के लिए बेहतर होगी (जैसे कि आपको खराब होने से बचाएगी, आदि)।
jcmeloni

@jcmeloni नहीं, मुझे मूल्यांकन के लिए भुगतान नहीं किया जा रहा है। लेकिन मेरे अनुभव में , और उन छोटी-छोटी चीजों से जिन्हें मैंने पिछले कुछ दिनों में उठाया है, उनके पास अभी मेज पर और कोई नहीं है। मेरी निपुणता काफी असामान्य है, इसलिए मुझे यह और भी अधिक सुगमता है कि बोली के आधार पर उनके पास किसी और के लिए प्रतिस्पर्धा नहीं है। प्रश्न में वास्तविक उद्धरण मेरे ग्राहक से उनके ग्राहक के लिए है, जो उन्हें अनुबंध को फिर से पुरस्कार देने की योजना बना रहा है। वास्तव में मेरे अंत से, मैं उक्त बोली प्रदान करने में उनकी सहायता करने के लिए हूं। HTH।
इंजीनियर

@Oded नामकरण निश्चित रूप से परीक्षण और त्रुटि विलोपन की तुलना में आसान है! वहां अच्छी सोच है। यह बॉक्स में एक और उपकरण है।
इंजीनियर

जवाबों:


32

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

  • पेज क्या हैं, और इनबाउंड क्या है, इसका अंदाजा लगाने के लिए स्पाइडरिंग टूल का इस्तेमाल करें। यहां तक ​​कि एक बुनियादी लिंकेचर टूल - ऑडिटिंग उद्देश्यों के लिए एक विशिष्ट "मकड़ी नहीं" उपकरण - इस संबंध में उपयोगी होगा।
  • एक मूल ऑडिट / इन्वेंट्री स्प्रेडशीट बनाएं। यह निर्देशिका द्वारा व्यवस्थित फाइलों और उनके अंतिम-संशोधित समय की सूची के रूप में सरल हो सकता है। इससे आपको गुंजाइश की भावना प्राप्त करने में मदद मिलेगी, और जब आप _OLD और _DELETE जैसी निर्देशिकाओं को प्राप्त करते हैं तो आप एक बड़ा नोट कर सकते हैं कि क) आपका मूल्यांकन उन निर्देशिकाओं में नहीं सामान पर आधारित है ) उन निर्देशिकाओं की उपस्थिति और संभावित के लिए cruft / छिपे दुःस्वप्न आपके क्लाइंट की बोली में किसी तरह से शामिल होने वाले गहरे मुद्दों पर ध्यान केंद्रित करते हैं । आपको गॉज़िलियन वर्षों को _OLD या _DELETE में संभावित मुद्दों की गणना करने की आवश्यकता नहीं है; जानकारी अंतिम बोली में फीड होगी।
  • यह देखते हुए कि आप पूरी तरह से वेब-आधारित ऐप की तरह लग रहे हैं, यहां तक ​​कि मानक लॉग विश्लेषक उपकरण भी आपके दोस्त बनने जा रहे हैं। आप स्प्रेडशीट में "यह पहुंच वाली स्क्रिप्ट्स के शीर्ष 10 में है" या कुछ इस तरह से जोड़ सकते हैं। भले ही स्क्रिप्ट फ़्लैश फ़ाइलों में एम्बेडेड हो और इसलिए स्पाइडरेबल न हों, एक उच्च संभावना है कि उन्हें POST या GET के माध्यम से एक्सेस किया जाता है, और सर्वर लॉग में दिखाई देगा। यदि आप जानते हैं कि आपके पास 10 अत्यधिक एक्सेस की गई स्क्रिप्ट हैं, तो 100 (या इसके विपरीत) नहीं, इससे आपको एक अच्छा विचार मिलेगा कि रखरखाव का काम कैसे चलेगा।

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


2
+1 यह एक शानदार जवाब है। कहाँ है कि +5 बटन मिल गया ...
इंजीनियर

1
टीएल; डीआर: जब तक आपको अपने आप को एक खरगोश छेद नीचे नहीं भेजना है। :)
jcmeloni

4

मैं दृढ़ता से मौजूदा स्रोत कोड को फिर से लिखने की सलाह देता हूं (जैसा कि एक पुनर्लेखन के विपरीत) " वर्किंग इफेक्टिवली विथ लेगेसी कोड " पुस्तक में पाए गए पैटर्न का उपयोग करके ।

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

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

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

"एक सूक्ष्म कारण है कि प्रोग्रामर हमेशा कोड को फेंकना और शुरू करना चाहते हैं। इसका कारण यह है कि उन्हें लगता है कि पुराना एक गड़बड़ है। और यहाँ दिलचस्प अवलोकन है: वे शायद गलत हैं। कारण यह है कि वे पुराने सोचते हैं। कोड एक गड़बड़ है, क्योंकि प्रोग्रामिंग का एक मौलिक, मौलिक नियम है:

इसे लिखने की तुलना में कोड को पढ़ना कठिन है। "- http://www.joelonsoftware.com/articles/fog000000006969.html


4
+1। जोएल की टिप्पणी के जवाब में, "यह अच्छी तरह से खूनी नहीं होना चाहिए।" क्योंकि मैं समस्या को अंतर्निहित नहीं देखता। मैं इसे आंशिक रूप से इस तथ्य के रूप में देखता हूं कि बहुत से लोग घटिया कोड लिखते हैं और परवाह नहीं करते हैं, जबकि कई अन्य यथोचित रूप से अच्छा कोड लिखते हैं, लेकिन "स्व-दस्तावेजीकरण कोड" अवधारणा से जीते हैं ... जो सिर्फ सादा है बीएस: एक चापलूसी कर सकता है सभी का अपना कोडिंग स्टाइल एकांत में होता है, लेकिन जब पब्लिक कोडबिस की बात आती है तो कमेंट करते हैं जैसे कल नहीं है। चोट नहीं करता है। और अंत में ऐसे लोग हैं जिन्हें एक तंग समय बजट पर, एक विरासत कोडबेस में काम करने वाली चीजें मिलनी हैं।
इंजीनियर

2

एक विशिष्ट जावा कोड बेस में, मैं पीएमडी, फाइंडबग्स, या सोनार जैसे टूल का उपयोग करने पर विचार करूंगा और फिर टूल रिपोर्टिंग (डेड कोड, अनकम्प्रेस्ड कोड, डुप्लिकेटेड कोड आदि) को समझने की कोशिश करूंगा।

रिपोर्टों के आधार पर मैं आवेदन / साइट (व्यापार परत, DB, SQL, आदि) की विभिन्न परतों को खोजने की कोशिश करूँगा।

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


1
धन्यवाद। हालाँकि आपका उत्तर कुछ हद तक जावा विशिष्ट है, आपके स्तरित दृष्टिकोण को देखना दिलचस्प है ... प्याज को छीलना, इसलिए बोलना। कुछ चीजें सोचने के लिये।
इंजीनियर

1

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

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


आमतौर पर मैं टॉस-एंड-रीराइट दृष्टिकोण पर आपके साथ 100% होगा। लेकिन इस उदाहरण में (और कम से कम अभी के लिए), मुझे साइट को बनाए रखने के लिए काम के लिए भुगतान किया जाना है, बजाय अधिक व्यापक ओवरहाल के जो कई सप्ताह लगेंगे। इसके अलावा, यहां तक ​​कि अगर मैं अभी चाहता था, तो मैं ऐसा करने और अन्य अनुबंधों को जारी रखने के साथ नहीं रख सकता था, क्योंकि इसके लिए मेरी साप्ताहिक उपलब्धता स्पष्ट रूप से सीमित है - मेरा प्राथमिक अनुबंध इसके लिए पूरा होना चाहिए 40 घंटे साप्ताहिक न्यूनतम।
इंजीनियर

1
टॉस और फिर से लिखना से असहमत! से joelonsoftware.com/articles/fog0000000069.html ... "वहाँ एक सूक्ष्म कारण यह है कि प्रोग्रामर हमेशा दूर कोड फेंक और फिर से प्रारंभ करना चाहते हैं। कारण है उन्हें लगता है कि पुराने कोड एक गड़बड़ है। और यहाँ रोचक अवलोकन है : वे शायद गलत हैं। इसका कारण यह है कि उन्हें लगता है कि पुराने कोड में गड़बड़ी है, क्योंकि यह कार्डिनल, प्रोग्रामिंग का मौलिक नियम है: इसे लिखने की तुलना में कोड को पढ़ना कठिन है। " इसके बजाय, मैं दृढ़ता से सिफारिश करने की सलाह देता हूं: amazon.ca/Working-Effectively-Legacy-Michael-Feathers/dp/…
Kyle Hodgson

1
@KyleHodgson कभी-कभी कोड वास्तव में एक गड़बड़ है, और जब आप इस बिंदु पर होते हैं कि इसे पढ़ने से पहले कोड को खोजने के लिए एक गड़बड़ है, तो इसके शुरू होने का समय।
रायथल

हाँ, मुझे नहीं लगता कि यह उतना स्पष्ट रूप से कटा हुआ है, हालाँकि यह पुस्तक पढ़ने लायक है। यह कोडबेस के आकार / जटिलता और कार्य करने के लिए उपलब्ध गर्म निकायों पर बहुत निर्भर करता है।
इंजीनियर

1

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


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

0

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

आपने पिछले पैराग्राफ में पहले से ही अपने प्रश्न का उत्तर दिया है: देखें कि एप्लिकेशन चालू होने के दौरान क्या एक्सेस किया जाता है।

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

  2. स्रोत कोड की समीक्षा करना, प्रश्नों की खोज करना अधिक सहायक है, और सभी प्रश्नों को एकत्र करने के बाद, आप डेटाबेस के उपयोग की अच्छी समझ रख सकते हैं, आवृत्ति के संदर्भ में नहीं (यह वह जगह है जहाँ एक प्रोफाइलर काम करता है), लेकिन उपयोग किए गए / नहीं के संदर्भ में तालिकाओं का उपयोग किया। अफसोस की बात है, वर्षों के कोडबेस के लिए एक बुरी तरह से लिखित / अनुरक्षित नहीं होने के लिए, यह अत्यंत कठिन और त्रुटि प्रवण हो सकता है , खासकर यदि प्रश्नों का निर्माण गतिशील रूप से किया जाता है (एक विधि की कल्पना करें, जो, selectतालिका के नाम के रूप में एक पैरामीटर का उपयोग करता है; आप कैसे कर सकते हैं? संभवतः पता है कि स्रोत कोड को देखकर पैरामीटर के संभावित मूल्य क्या हैं?)।

  3. स्थैतिक विश्लेषण और कुछ संकलक भी मृत कोड प्रकट कर सकते हैं, लेकिन फिर भी आपको वह उत्तर नहीं देते हैं जो आप चाहते हैं।

  4. डेटा का विश्लेषण स्वयं या डेटाबेस मेटाडेटा कुछ दिलचस्प जानकारी प्रकट कर सकता है। उदाहरण के लिए, यह दावा करना आसान होगा कि तालिका LogonAudit(uniqueidentifier LogonAuditId, datetime LogonEvent, ...)का उपयोग अब और नहीं किया जाता है यदि इसमें वर्ष 2006 से 2009 के लिए प्रति दिन 10 000 रिकॉर्ड होते हैं, और सितंबर, 18 वें , 2009 से कोई रिकॉर्ड नहीं है । यह एक के लिए सच नहीं है तालिका जिसमें ज्यादातर केवल-पढ़ने के लिए प्रेरित डेटा होता है।

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

// Warning: WTF code below. Read with caution, never reuse it, and don't trust
// the comments.

private IEnumerable<Product> GetProducts()
{
    // Get all the products.
    return this.GetEntities<Product>("PRODUCT");
}

private IEnumerable<T> GetEntities<T>(string tableName)
{
    // Everyone knows that SQL is case sensitive.
    tableName = tableName.ToLower();

    if (tableName == "user" || tableName == "product")
    {
        // Those tables were renamed recently in the database. Don't have time
        // to refactor the code to change the names everywhere.
        // TODO: refactor the code and remove this `if` block.
        tableName += "s";
    }

    if (this.IsDelme(tableName))
    {
        // We have some tables which are marked for deletion but are still
        // used, so we adjust their name.
        tableName = this.Delme(tableName);
    }

    return this.DoSelectQuery<T>("select top 200 * from " + tableName);
}

private bool IsDelme(string name)
{
    // Find if the table is among candidates for removal.
    List<string> names = this.Query<string>("select Names from DelmeTables");
    return names.Contains(name);
}

private string Delme(string name)
{
    // Return the new name for a table renamed for deletion.
    return string.Join("_", new [] { name, "delme", "not", "used" });
}

क्या आप यह पता लगा सकते हैं कि यह कोड वास्तव में products_delme_not_usedतालिका का उपयोग करता है?

अगर में तुम होता तो में:

  1. सभी डेटाबेस ऑब्जेक्ट को जगह पर रखें,
  2. पूरे आवेदन को रिफलेक्टर करें (यदि यह इसके लायक है),
  3. दस्तावेज़ (रिफ्लेक्टरिंग करते समय) अनुप्रयोग और विशेष रूप से डेटाबेस उपयोग।

जब आप अंतिम दो चरणों को पूरा करते हैं, तो आपको संभवतः डेटाबेस उपयोग की बेहतर समझ होगी, जो उन तालिकाओं के नामों का पता लगाने में मदद करेगा जो अब उपयोग नहीं किए जाते हैं, और कम या ज्यादा सुरक्षित रूप से उन्हें हटा सकते हैं।


0

यह मुझे लगता है कि आपको एक उद्धरण बनाने के लिए पर्याप्त जानकारी प्राप्त करने की आवश्यकता है इसलिए मैं उस प्रयास पर ध्यान केंद्रित करूंगा।

मैं यह निर्धारित करने की कोशिश करूंगा कि इस साइट में कितने उपयोग के मामले हैं। यह आम तौर पर आपको यह अनुमान लगाता है कि साइट कितनी बड़ी और जटिल है और साइट / एप्लिकेशन को फिर से बनाने या बनाए रखने में कितना समय लगेगा।

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

स्रोत कोड को देखते हुए, वेब पेज और डेटाबेस टेबल को आपको इसे खोजने में मदद करनी चाहिए।

आप प्रति माह घंटों की संख्या को सीमित करने पर भी विचार कर सकते हैं, जिसे आप इस परियोजना पर पूर्व निर्धारित शुल्क के लिए स्वयं की सुरक्षा के लिए खर्च करेंगे।

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

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