आप सुरक्षित रूप से कोड के एक टुकड़े को कैसे हटाते हैं जो ऐसा लगता है कि यह कभी दर्ज नहीं किया गया है?


125

आपको कुछ ऐसा कोड मिला है जो शानदार लगता है, और संकलक को यह ध्यान नहीं है। आप यह सुनिश्चित करने के लिए क्या करते हैं (या आप कर सकते हैं के रूप में करीब के रूप में) कि इस कोड को हटाने से प्रतिगमन का कारण नहीं होगा।

मन में दो विचार वसंत।

  1. "बस" कोड का उपयोग करना चाहिए या नहीं, इसके आधार पर लगता है कि इसे निष्पादित करना चाहिए। हालांकि, कभी-कभी यह एक जटिल, समय लेने वाली नौकरी हो सकती है, बिना किसी पर्याप्त व्यवसाय के रिटर्न के लिए थोड़ा जोखिम भरा (आपका मूल्यांकन त्रुटि का खतरा है)।

  2. लॉगिंग को उस कोड सेक्शन में रखें और देखें कि यह कितनी बार व्यवहार में आता है। पर्याप्त निष्पादन के बाद, आपको कोड को सुरक्षित करने के लिए उचित आत्मविश्वास होना चाहिए।

क्या कोई बेहतर विचार या कुछ एक विहित दृष्टिकोण की तरह है?


55
यह संस्करण नियंत्रण इतिहास को देखने के लिए सहायक हो सकता है: "मृत कोड" कब बनाया गया था? जब यह बनाया गया था तब क्या यह मृत दिख रहा था? क्या अन्य कोड (जिसे बाद में संशोधित या हटा दिया गया है) की जाँच की गई जिसमें उसने इसका उपयोग किया था, उसी समय इसे बनाया गया था?
क्रिस डब्ल्यू

9
संकलक पर भरोसा नहीं किया जा सकता है अगर किसी भी रूप में मेटा-प्रोग्रामिंग जैसे प्रतिबिंब खेल में है। आधार निर्देशिका का एक उचित grep एक आवश्यक अभ्यास है। कई एप्लिकेशन साझा करना भी आम बात है ताकि सही डायरेक्टरी लेयर पर grep होना सुनिश्चित हो।
एडम कैविनेस

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

40
@mickeyf नुकसान यह है कि किसी को उस कोड को बनाए रखना है। इसका मतलब है कि एक डेवलपर को यह समझना होगा कि वह क्या करता है। अगर चीजों में बदलाव होता है तो डेवलपर को इसे संशोधित करना होगा और इसके आसपास के कोड को अब कुछ अलग करना होगा। मेरा विश्वास करो, जब आप चारों ओर झूठ बोलना छोड़ते हैं, तो बाद में चीजों को जानने की कोशिश करने वाले किसी भी व्यक्ति के लिए यह एक प्रमुख सिरदर्द है।
jpmc26

9
@MichaelJ। मेरा कहना है कि यह पहली जगह में नहीं होना चाहिए था। और अगर मैं इसे छोड़ देता हूं, तो स्थिति बदतर है: अब लाइन के नीचे कुछ अन्य डेवलपर को भी इसकी जांच करनी होगी। यह जितना लंबा रहेगा, इसे समझने में उतना ही अधिक समय खर्च होता है। यह सुपरफ्लस कोड की लागत है।
jpmc26

जवाबों:


112

मेरी सही फंतासी दुनिया में जहां मेरे पास 100% यूनिट टेस्ट कवरेज है मैं इसे बस हटा दूंगा, अपनी यूनिट परीक्षण चलाऊंगा, और जब कोई परीक्षण लाल नहीं होगा, तो मैं इसे प्रतिबद्ध करता हूं।

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

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

249
बड़े-ईश सॉफ्टवेयर प्रोजेक्ट्स की स्थिति का अवलोकन करने के बाद, जहां इंजीनियरों ने दस से बारह वर्षों के लिए, ज्यादातर संभावना नहीं कोड को हटाने के लिए "इसके लायक नहीं" दृष्टिकोण का पालन किया था, मैं इस दृष्टिकोण की सिफारिश नहीं कर सकता
15:55 बजे njuffa

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

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

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

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

84

इस प्रक्रिया के दो पड़ाव हैं। पहला यह पुष्टि कर रहा है कि कोड वास्तव में मृत है। दूसरा गलत होने की लागतों को समझ रहा है और यह सुनिश्चित करता है कि वे ठीक से कम हो गए हैं।

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

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

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

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


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

15
@kojiro यह बहुत सच है। मुझे लगता है कि चेस्टनटन ठीक होगा अगर मैं "आधुनिक सुधारक" के रूप में आया और कहा कि "मुझे नहीं पता कि यह बाड़ यहाँ क्यों है, मैं इसे स्वीकार करता हूं। लेकिन मैं इसे देखने के लिए लाल रंग करना चाहूंगा। मुझे कोई भी नई जानकारी प्रदान करता है, "चेस्टरटन शायद इससे खुश होगा।
Cort Ammon

41
VMS OS कर्नेल मोड क्लॉक डिकोडिंग विधि SYS $ ASCTIM में कोड की एक पंक्ति होती है जो कि वर्चस्व विषुव के साइडइल बहाव के लिए सही करने में मदद करती है। डीईसी की इकाई परीक्षणों में से कोई भी इस कोड का उपयोग नहीं करता है। यह एक बार - सही ढंग से - 2000-02-28 को 23: 59: 59: 999 पर चला। यह वर्ष 2400 तक फिर से नहीं चलेगा। कृपया इसे हटाएं नहीं।
एआई ब्रेवेलरी

13
@AIBreveleri मुझे उम्मीद करनी चाहिए कि यह बताने वाले कोड में ही एक टिप्पणी है, और यहाँ केवल StackExchange पर नहीं है: D
काइल स्ट्रैंड

11
@KyleStrand आप किस बारे में बात कर रहे हैं? यह है प्रलेखन। क्या आप महत्वपूर्ण जानकारी डालने के लिए एक बेहतर जगह के बारे में सोच सकते हैं ताकि अन्य लोग इसे StackExchange की तुलना में ढूंढ सकें? ;-)
Cort Ammon

43

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


11
मैं एक नीच नहीं हूं, लेकिन क्या होगा यदि आपको जिस कोड अनुभाग पर संदेह है, वह कभी नहीं चलता है, एक पूर्ण फ़ंक्शन या वर्ग नहीं है, बल्कि एक विधि / फ़ंक्शन का एक खंड है?
ट्यूलेंस कोर्डोवा

9
भाषा के आधार पर यह हमेशा विश्वसनीय नहीं हो सकता है - कुछ भाषाएं डायनेमिक तरीके से कॉल करने की अनुमति देती हैं। उदाहरण के लिए php:$object->$variableMethod($arg1, $arg2);
डेजा

9
@ TulainsCórdova फिर यह संभवतः एक अच्छा समाधान नहीं है। हर संभावित समाधान के लिए, इसका उपयोग करें यदि यह दिए गए संदर्भ में समझ में आता है। लेकिन शायद grepउदाहरण के लिए आईएनजी। फ़ंक्शन में कोड सेक्शन को शामिल करने से यह संकेत मिल सकता है कि फ़ंक्शन का उपयोग कैसे किया जाता है और इसलिए इसकी सामग्री?
pivi

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

यह उपयोगी है यदि आपके पास सभी संभावित कोड तक पहुंच है जो फ़ंक्शन का उपयोग कर सकता है। हालाँकि, यदि कोड किसी लाइब्रेरी का हिस्सा है, तो आपको कैसे पता चलेगा कि कुछ और जिसे आप खोज नहीं सकते, वह नहीं टूटेगा?
केविन शी

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

सब कुछ के लिए एक पहली बार है, इसलिए सिर्फ इसलिए कि कोड नहीं चला था इसका मतलब यह नहीं चलेगा, खासकर अगर वहाँ एक निष्पादन मार्ग है। यह कहा गया है कि किसी ऐसी चीज को हटाने का निर्णय लेना जो निष्पादित कर सकती है, यह निर्धारित करने से अलग प्रक्रिया है कि वह चल सकती है या नहीं।

7
@nocomprende वास्तव में क्या होता है यदि यह कोड केवल वर्ष फ़ंक्शन के अंत के लिए उपयोग किया जाता है और आप अपने परीक्षण को चलाते हैं Feb - Nov. आप उपयोग नहीं पाएंगे, भले ही आपने इसे लगभग पूरे वर्ष के लिए प्रोफाइल किया हो।
एरिक

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

1
@ 9000 प्रतियोगिता। अब साइलो बी के कोड में साइलो ए के कोड में "डेड" कोड पथ के लिए एक अस्थायी युग्मन है जो केवल साइलो ए के कोड को देखकर स्पष्ट नहीं है। आप इस टेम्पोरल कपलिंग के लिए यूनिट टेस्ट कैसे करेंगे क्योंकि टेम्पोरल कपलिंग केवल साइलो बी के कोड में है बिना साइलेंट बी से बात किए बिना? फिर भी समय आपके कोड में एक कारक नहीं है (साइलो ए) तो एक अस्थायी परीक्षण कैसा दिखेगा?
एरिक

2
किसी को भी Y2k पैनिक याद है ? कुछ कोड 2000 में सही थे क्योंकि यह 2100 के लिए गलत था! हमारे पास एक संभावित मुद्दा था जो 100 वर्षों में एक बार या 400 वर्षों में एक बार भी हो सकता है।
स्टीव बार्न्स

16

उल्लिखित मौजूदा उत्तरों के अलावा आप कई संस्करणों पर कोड को पुनरावृत्त कर सकते हैं।

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

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


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

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

7

बहुत सारे लोग सुझाव दे रहे हैं कि "सुरक्षित" करने के लिए कोड को छोड़ना है यदि आप यह साबित नहीं कर सकते हैं कि यह अप्रयुक्त है।

लेकिन कोड एक परिसंपत्ति नहीं है, यह एक दायित्व है।

जब तक आप यह समझा नहीं सकते कि यह महत्वपूर्ण क्यों है और इसके परीक्षणों की ओर इशारा करते हैं, "सुरक्षित" विकल्प इसे हटाने के लिए बहुत अच्छी तरह से हो सकता है।

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


चरण 1: सभी कोड हटाएं। चरण 2: जो आवश्यक है उसे वापस रखें। चरण 3: दोहराएं।

1
@ एड्रियन क्या मैं नाइट कैपिटल पर आपका ध्यान आकर्षित कर सकता हूं? en.wikipedia.org/wiki/… - यदि आप इसके संदर्भ में अपनी बात कहना चाहते हैं तो बस। वे मूल रूप से फंस गए क्योंकि कुछ पुराने कोड जीवन में वापस आ गए और कृपया उनके लिए लगभग $ 500m खो दिया। आगामी जांच उनकी रिहाई प्रक्रियाओं पर केंद्रित थी, लेकिन मुख्य समस्या "मृत कार्यक्षमता को हटाया नहीं गया था"।
सुसान डब्ल्यू

6

आप अपने सॉफ़्टवेयर के निष्पादन पथ को बदलने के लिए फीचर टॉगल का उपयोग कर सकते हैं, ताकि प्रश्न में कोड को पूरी तरह से अनदेखा कर सकें।

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

यह दृष्टिकोण आपको आत्मविश्वास प्रदान करना चाहिए अगर आपको लंबे समय तक कोई समस्या नहीं दिखती है और साथ ही इसे लाइव w / oa परिनियोजन पर वापस चालू करने की क्षमता है। हालाँकि, एक बेहतर तरीका यह भी होगा कि प्रश्न में क्षेत्र के चारों ओर अतिरिक्त लॉगिंग और परीक्षण कवरेज भी लागू किया जाए जो अधिक प्रमाण प्रदान करेगा कि इसका उपयोग किया गया है या नहीं।

टॉगल के बारे में यहाँ और अधिक पढ़ें: https://martinfowler.com/articles/feature-toggles.html


6

निश्चित रूप से स्थैतिक विश्लेषण ... और अच्छी बात यह है, आपको किसी नए टूल की आवश्यकता नहीं है; आपके कंपाइलर के पास सभी स्थिर विश्लेषण उपकरण हैं जिनकी आपको आवश्यकता है।

बस विधि (जैसे परिवर्तन का नाम बदलने DoSomethingके लिए DoSomethingX) और फिर निर्माण चलाते हैं।

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

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

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


8
प्रोग्रामिंग भाषाओं के लिए यह ठीक सलाह है जिसमें पूर्ण गतिशील / देर से बाध्यकारी नहीं है । हालांकि, उन लोगों के लिए, यह मुश्किल है। और, बेशक - कोड विधि का उपयोग कर रहा हो सकता है, भले ही यह उत्पादन में कभी भी उपयोग न किया गया हो।
eis

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

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

हो सकता है कि हम "बाइंडिंग" से जो मतलब है, उससे असहमत हों जो मेरे लिए एक भौतिक प्रतिनिधित्व के लिए एक तार्किक प्रतिनिधित्व के संकल्प को इंगित करता है, जैसे एक पते के लिए एक प्रतीक। जावास्क्रिप्ट फ़ंक्शंस को टैगिंग / वैल्यू पेयर के रूप में सम्‍मिलित ऑब्जेक्ट के भीतर संग्रहीत किया जाता है, इसलिए बाइंडिंग की कोई भी धारणा नॉन सीक्वेटुर लगती है।
जॉन वू

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

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

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

3
यह फंतासी में काम करेगा जब परीक्षण कवरेज लगभग 90% है, लेकिन क्या होगा और अगर आपके पास कोड की 100.000 पंक्तियों के साथ एक परियोजना है। यही कारण है कि मैंने कोड का परीक्षण करने का प्रयास करने का वर्णन किया है और यदि कोई परीक्षण कोड तक पहुंचने में सक्षम नहीं है ... तो यह मृत हो सकता है।
मार्कस लुसबर्ग

आईएमएचओ यदि आप पूरी तरह से कोड को हटाने से खुद को पकड़ने के लिए पर्याप्त अनिश्चित हैं - तो आपको उत्पादन में अपवाद नहीं फेंकना चाहिए - ओपी द्वारा सुझाए गए लॉगिंग एक बेहतर विकल्प है, वही प्राप्त करता है, और आप ग्राहकों की शिकायत करने के बजाय निदान प्राप्त कर सकते हैं
सेबी

@JohannesHahn मुझे लगता है कि आप का मतलब है, "उत्पादन कोड," जो कोड है जो उत्पादन वातावरण में चलता है।
jpmc26

@ jpmc26 हां, बिल्कुल।
जोहान्स हैन

3

अगम्य कोड निकालना

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

दुर्भाग्यवश, सभी भाषाएँ वैधानिक रूप से टाइप नहीं की जाती हैं, और सभी वैधानिक रूप से टाइप की जाने वाली भाषाएँ राजसी नहीं होती हैं। जो चीजें गलत हो सकती हैं उनमें (1) परावर्तन और (2) अप्रत्याशित ओवरलोडिंग शामिल हैं।

यदि आप एक गतिशील भाषा, या पर्याप्त शक्तिशाली प्रतिबिंब वाली भाषा का उपयोग करते हैं, जो कि जांच के तहत कोड का टुकड़ा संभवतः प्रतिबिंब के माध्यम से रन-टाइम पर पहुँचा जा सकता है, तो आप संकलक पर भरोसा नहीं कर सकते। ऐसी भाषाओं में पायथन, रूबी या जावा शामिल हैं।

यदि आप अनिर्दिष्ट ओवरलोडिंग वाली भाषा का उपयोग करते हैं, तो केवल एक अधिभार को हटाने से अधिभार संकल्प को चुपचाप दूसरे अधिभार पर स्विच किया जा सकता है। ऐसी कुछ भाषाएं आपको कोड के उपयोग से जुड़ी संकलन-समय की चेतावनी / त्रुटि को प्रोग्राम करने देती हैं, अन्यथा आप कंपाइलर पर भरोसा नहीं कर सकते। ऐसी भाषाओं में जावा (उपयोग @Deprecated) या C ++ (उपयोग [[deprecated]]या = delete) शामिल हैं।

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

अगले भाग को क्यू ...


संभावित अप्रयुक्त कोड हटाना

अधिक संभावना है, कोड को वास्तव में संदर्भित किया जाता है, हालांकि आपको संदेह है कि कोड की शाखाओं का अभ्यास करने से यह संदर्भ नहीं लिया जाता है।

इस मामले में, कोई फर्क नहीं पड़ता कि भाषा, कोड प्रदर्शन रूप से उपलब्ध है, और केवल रन-टाइम इंस्ट्रूमेंटेशन का उपयोग किया जा सकता है।

अतीत में, मैंने ऐसे कोड को हटाने के लिए 3-चरणों के दृष्टिकोण का सफलतापूर्वक उपयोग किया है:

  1. प्रत्येक शाखा पर संदेह नहीं किया जा सकता है, एक चेतावनी लॉग ऑन करें।
  2. एक चक्र के बाद, एक अपवाद को फेंक दें / कोड के विशिष्ट टुकड़े में प्रवेश करने पर एक त्रुटि लौटाएं।
  3. एक और चक्र के बाद, कोड हटाएं।

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

उम्मीद है, अधिकांश अनुप्रयोगों में छोटे चक्र होते हैं।

मैं एक TODO टिप्पणी डालने की सलाह देता हूं, एक तारीख के साथ, अगले कदम पर आगे बढ़ने की सलाह देता हूं। और आपके कैलेंडर में एक अनुस्मारक।


1
वास्तव में, C ++ में आप अपने संदिग्ध अधिभार [[deprecated]]को उन साइटों की पहचान करने के लिए चिह्नित कर सकते हैं जो उस संस्करण को कहते हैं; तब आप यह देखने के लिए उनका निरीक्षण कर सकते हैं कि क्या उनका व्यवहार बदल जाएगा। वैकल्पिक रूप से, अपने अधिभार को = deleteइस रूप में परिभाषित करें - इस मामले में, आपको अन्य संस्करणों में से एक का उपयोग करने के लिए स्पष्ट रूप से तर्क देने की आवश्यकता होगी।
टॉबी स्पाइट

@ TobySpeight: यह सच है, और एक अच्छा विकल्प भी। मुझे वह संपादित करने दें।
मैथ्यू एम।

"डॉक्टर, ऐसा करने पर मुझे दर्द होता है।" "ठीक है, ऐसा मत करो ! " दृष्टिकोण का उपयोग न करें जो कोड को असहनीय बनाते हैं।

2

उत्पादन से कोड हटाना सफाई घर की तरह है। जिस क्षण आप अटारी से एक वस्तु को फेंक देते हैं, आपकी पत्नी अगले दिन 1923 में अपने पड़ोसी से अपनी महान दादी मां के तीसरे भतीजे की घर वापसी के उपहार को फेंकने के लिए आपको मार देगी।

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

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

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

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

IMHO, टिप्पणी बहुत ही शानदार है और हटाने के लिए एक उम्मीदवार है।


12
यदि मेरे पास संस्करण नियंत्रण के बराबर है , तो मेरी पत्नी की आपत्ति आसानी से उलट जाएगी। तो कोड हटाने के साथ भी: यह हत्या का अपराध नहीं है। भंडार को कभी भी फेंका नहीं जाता है।
जडलुगोज़

मैंने सोचा था कि ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग उस दायरे को कम करने वाली थी जिसमें एक विधि को बुलाया जा सकता है। तो यह कोड के लिए नेतृत्व करना चाहिए जो अधिक आसानी से समझा और प्रबंधित किया जाता है, है ना? नहीं तो, हम ऐसा क्यों कर रहे हैं?

इस धागे में कहीं भी @nocomprende यह इंगित नहीं करता है कि चर्चा केवल OOP डिज़ाइन / भाषाओं तक सीमित है। मुझे यकीन नहीं है कि आपको क्यों लगता है कि यह प्रासंगिक है।
अंडरस्कोर_ड

1

हो सकता है कि कंपाइलर यह नोटिस करता है कि, यह सिर्फ उपद्रव नहीं करता है।

फुल कंपाइलर ऑप्टिमाइजेशन के साथ एक बिल्ड चलाएं, आकार की ओर तैयार। फिर संदिग्ध कोड को हटाएं, और फिर से बिल्ड को चलाएं।

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

यदि बायनेरिज़ अलग हैं ... तो यह अनिर्णायक है। यह कुछ और बदलाव हो सकता है। कुछ कंपाइलरों में बाइनरी में संकलन की तारीख और समय भी शामिल है (और शायद इसे दूर कॉन्फ़िगर किया जा सकता है!)


1
सभी भाषाएं संकलित नहीं हैं, सभी कंपाइलरों में अनुकूलन नहीं है और सभी अनुकूलन समान नहीं हैं, कई लोग अन-इनवॉल्ड कोड को केवल उस स्थिति में नहीं निकालते हैं जब कोड एक कारण के लिए होता है। यदि कोड किसी साझा लाइब्रेरी / DLL में रहता है, तो उसे हटाया नहीं जाएगा।
स्टीव बार्न्स

1
@SteveBarnes ठीक है, हाँ, अगर आप LTO और स्टैटिक-लिंकिंग सब कुछ नहीं कर रहे हैं, तो आप कुछ दर्द में हैं। वह दे दिया गया।
नवीन

1

मैं वास्तव में हाल ही में इस सटीक स्थिति में आया हूं, "deleteFoo" नामक एक विधि के साथ। पूरे कोडबेस में कहीं नहीं था कि स्ट्रिंग को विधि घोषणा के अलावा पाया गया, लेकिन मैंने बुद्धिमानी से विधि के शीर्ष पर एक लॉग लाइन लिखी।

पीएचपी:

public function deleteFoo()
{
    error_log("In deleteFoo()", 3, "/path/to/log");
}

यह पता चला है कि कोड का उपयोग किया गया था! कुछ AJAX विधि "विधि: डिलीट, एलीम = फू" कहती है जिसे बाद में कॉल किया जाता है और call_user_func_array () के साथ कॉल किया जाता है ।

जब संदेह में, लॉग! यदि आपने लॉग को देखे बिना पर्याप्त समय दिया है, तो कोड को हटाने पर विचार करें। लेकिन फिर भी अगर आप कोड को हटाते हैं, तो लॉग को जगह पर छोड़ दें और उस टिप्पणी के लिए टिप्पणी करें जो उस व्यक्ति के लिए Git में कमिटमेंट ढूंढना आसान है जिसे उसे बनाए रखना है!


PHP और Perl के लिए लाइब्रेरीज़ हैं जिन्हें टॉम्बस्टोन (php: github.com/scheb/tombstone ) कहा जाता है जो यहाँ उपयोगी हो सकते हैं।
एलिस्टर बुलमैन

0

grepपहले आपके पास जो भी उपकरण उपलब्ध हैं, उनका उपयोग करें , आपको कोड के संदर्भ मिल सकते हैं। (मूल रूप से मेरे निर्देश / सलाह नहीं।)

फिर तय करें कि क्या आप कोड को हटाने का जोखिम उठाना चाहते हैं, या यदि मेरा सुझाव उपयोग में आ सकता है:

आप यह लिखने के लिए फ़ंक्शन / कोड के ब्लॉक को संशोधित कर सकते हैं कि इसका उपयोग लॉग फ़ाइल में किया गया है। यदि लॉग फ़ाइल में ऐसा कोई संदेश "कभी" दर्ज नहीं है, तो आप लॉगिंग कोड को संभवतः हटा सकते हैं।

दो समस्याएं:

  1. अन्य उपयोगकर्ताओं से लॉग प्राप्त करना। शायद आप एक वैश्विक ध्वज सेट कर सकते हैं जो प्रोग्राम को निकास पर क्रैश कर देगा और कृपया उपयोगकर्ता से आपको त्रुटि लॉग भेजने के लिए कहें।

  2. कॉल करने वाले का पता लगा रहा है। कुछ उच्च स्तरीय भाषाओं में (उदाहरण पायथन) आप आसानी से एक ट्रेसबैक प्राप्त कर सकते हैं। लेकिन संकलित भाषाओं में आपको लॉग पर वापसी पता सहेजना होगा और बाहर निकलने पर कोर डंप को मजबूर करना होगा (बिंदु 1)।
    सी में, यह काफी सरल होना चाहिए: एक सशर्त ब्लॉक का उपयोग करें (उदाहरण। #ifdef ... #endif) इसका उपयोग केवल तब करें जब आपको पता हो कि यह काम करेगा (और परीक्षण किया है कि यह करता है), और बस रिटर्न पता पढ़ें स्टैक से (इनलाइन असेंबली भाषा की आवश्यकता हो सकती है या नहीं भी हो सकती है)।

लॉग फ़ाइल में तर्कों को सहेजना उपयोगी हो सकता है या नहीं भी हो सकता है।


0

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

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

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

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

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

तो संक्षेप में - यदि आप जानते हैं कि कोड क्या करता है, तो पहले उसका परीक्षण करें। यदि आप नहीं करते हैं, तो आप शायद इसे अकेले छोड़ सकते हैं। यदि आप जानते हैं कि आप इसे अकेला नहीं छोड़ सकते हैं, तो बदलाव को लागू करने से पहले आक्रामक रूप से बदलाव का परीक्षण करने के लिए अपना समय समर्पित करें।


0

मेरा दृष्टिकोण, जिसे मैं हमेशा इस मामले में उद्योग मानक मानता था, अब तक अजीब तरह से उल्लेख नहीं किया गया है:

आँखों का दूसरा जोड़ा लें।

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

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


0

आपके प्रश्न का सरल उत्तर यह है कि आप सुरक्षित रूप से उस कोड को नहीं हटा सकते जिसे आप नहीं समझते हैं, जिसमें यह समझना शामिल नहीं है कि इसे कैसे कहा जाता है। कुछ जोखिम होगा।

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

यदि कोड स्रोत नियंत्रण में है, तो आप हमेशा यह पता कर सकते हैं कि इसे कब जोड़ा गया था और यह निर्धारित करें कि इसे तब कैसे कहा गया था।

अंततः, आप या तो इसे समझते हैं, इसे अकेले छोड़ देते हैं, या मौका लेते हैं।


0

यदि प्रश्न में कोड का डेवलपर अभी भी उपलब्ध है, तो उसके साथ कोड हटाने की समीक्षा करें । इसके अलावा, कोड में टिप्पणी पढ़ें

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

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

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

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


-1

मैं मार्कस लोसबर्ग के पहले बिंदु से दृढ़ता से सहमत हूं: कोड को निश्चित रूप से टूल की मदद से विश्लेषण किया जाना चाहिए। इस तरह के कार्य के साथ एप ब्रेन पर भरोसा नहीं करना है !!

अधिकांश मानक प्रोग्रामिंग भाषाओं का उपयोग IDEs में किया जा सकता है और प्रत्येक IDE जो कि लायक है उसे "सभी उपयोगों के लिए खोजें" -feature है जो इस तरह की स्थिति के लिए बिल्कुल सही उपकरण है। (उदाहरण के लिए ग्रहण में Ctrl + Shift + G)

बेशक: स्थैतिक विश्लेषक उपकरण सही नहीं हैं। अधिक जटिल परिस्थितियों के बारे में पता होना चाहिए जहां निर्णय कि विधि को कॉल किया जा रहा है, केवल रनटाइम पर होता है और जल्दी नहीं (परावर्तन के माध्यम से कॉल करता है, कॉलिंग "स्क्रिप्ट" आदि भाषाओं में)।


5
हो सकता है कि वानर का दिमाग कोड न लिख रहा हो? " मानव हाथों से अछूता " एक विपणन वाक्यांश हुआ करता था। मैंने हमेशा काम करने वाले गोरिल्ला हाथों की कल्पना की।

3
(एप दिमाग ने उपकरण भी लिखे हैं) (Shhh! आप कहानी को बर्बाद कर देंगे!)

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

1
... स्थैतिक कोड विश्लेषण थकाऊ, दोहराव वाला काम है जो एक कंप्यूटर द्वारा सबसे अच्छा किया जाता है। बिल्कुल उसी तरह का कार्य जिसे कंप्यूटर द्वारा मज़बूती से अंजाम दिया जा सकता है, लेकिन बंदर के मस्तिष्क द्वारा निष्पादित किए जाने पर यह अविश्वसनीय रूप से अविश्वसनीय है। उत्तरार्द्ध का उपयोग केवल उन चीजों के लिए किया जाना चाहिए जो कंप्यूटर उन पेचीदा प्रतिबिंबों और eval-call को खोजने की तरह नहीं कर सकता है।
जोहान्स हैन

1
फिर, बात याद आ रही है। यहां तक ​​कि अगर उपकरण सही नहीं हैं, क्योंकि वे एप ब्रेन द्वारा लिखे गए थे (और मुझे यकीन भी नहीं है कि अगर मुझे वह अनुदान देना चाहिए? स्थैतिक कॉल पदानुक्रम की गणना करना उतना मुश्किल नहीं है), वे अभी भी मैनुअल टास्क निष्पादन के लिए बहुत बेहतर हैं। यह एक सभी तरह की स्थिति नहीं है। एक 99% विश्वसनीय उपकरण अभी भी एक मस्तिष्क के लिए बेहतर है जो शायद 99% प्रतिशत से शुरू होता है लेकिन कोड की पहली हजार लाइनों के बाद बहुत कम दरों पर गिर जाता है।
जोहान्स हैन

-1

दो संभावनाएँ:

  1. आपके पास 99% + परीक्षण कवरेज है : कोड को हटा दें और इसके साथ किया जाए।
  2. आपके पास भरोसेमंद परीक्षण कवरेज नहीं है: तो जवाब में एक अवमूल्यन चेतावनी जोड़ना है । यानी, आप उस स्थान पर कुछ कोड जोड़ते हैं जो कुछ साने करता है (कुछ आसानी से दिखाई देने वाली जगह के लिए चेतावनी लॉग इन करें जो आपके आवेदन के दिन-प्रति-दिन उपयोग के साथ संघर्ष नहीं करता है, उदाहरण के लिए)। फिर इसे कुछ महीनों / वर्षों तक उबालने दें। यदि आपको कभी भी इसकी कोई घटना नहीं मिली, तो डिप्रेसेशन को उस चीज से बदल दें जो एक अपवाद को फेंकती है। थोड़ी देर तक ऐसे ही खड़े रहने दें। अंत में, सब कुछ पूरी तरह से हटा दें।

2
ऐसा लगता नहीं है कि बनाए गए कुछ बिंदुओं पर पर्याप्त रूप से प्रस्ताव दिया गया है और पहले 17 उत्तरों में समझाया गया है। कवरेज और डेप्रिसिएशन चेतावनी दोनों पर पहले से ही चर्चा की गई थी
gnat

@ भगना, तुम सही हो। जब मैंने पहली बार जवाबों को स्कैन किया, तो किसी कारण से मैंने सोचा कि मैंने कई लोगों को देखा है जो शीर्ष पर थे जो शीघ्र ही नहीं हुए और सफलतापूर्वक इन दो बिंदुओं पर पहुंच गए। उत्तरों के बीच में कुछ इस तरह हैं।
AnoE
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.