refactoring - कूटनीतिक रूप से आप कोड डुप्लिकेशन को समाप्त कर सकते हैं?




code-duplication (12)

कोड को सामान्य बनाना, चर सामान्य बनाना, डेटाबेस को सामान्य बनाना, कॉर्पोरेट पदानुक्रम को सामान्य बनाना, सरकार को सामान्य बनाना ...

डुप्लिकेट कोड के उन्मूलन के बारे में आप कट्टरपंथी हैं?

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

  1. कभी-कभी दोहराव में कमी बहुत कम है, क्योंकि नवनिर्धारित पद्धति में वास्तव में उपयोगी / पठनीय होने के लिए बहुत अधिक पैरामीटर हैं।
  2. कभी-कभी, परीक्षण कोड में, जब कई परीक्षण कोड का एक ही टुकड़ा का उपयोग करते हैं जो कि वास्तव में एक ठोस प्रवाह नहीं है, मैं अकेले दोहराव छोड़ देता है (लेकिन हमेशा नहीं - डुप आकार के आधार पर)

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


जैसा कि कहा गया है, मैं "सूखी" सिद्धांत से जीवित रहने की कोशिश करता हूं - लेकिन मैं यह भी कहूंगा कि एक और शर्त है जहां मैं दोहराव को खत्म करने के लिए अक्सर अनिच्छुक हूं:

  • उस कोड को संशोधित न करें जिसके लिए आपके पास (या आर्थिक रूप से व्यावहारिक रूप से विकसित नहीं हो सकता है) एक इकाई परीक्षण नहीं है।

परीक्षणों के उस सेट में शामिल किसी भी विधि के लिए कॉलिंग कोड शामिल होगा

अगर मैं इसका परीक्षण नहीं कर सकता, तो मैं वास्तव में नहीं कह सकता कि मैंने कोई दोष नहीं पेश किया है। एक परीक्षण सूट के साथ, मैं कम से कम यह कह सकता हूं कि यह क्या करता था


बहुत। जहां तक ​​मुझे अपने विकास के सभी युक्तियों, वचनों और "सर्वोत्तम तरीकों" से चिंतित है, जो कोड को दोहरा नहीं और इसे पुन: प्रयोज्य बनाने के सिद्धांत से जुड़ा है। एमवीसी, डेकोरेटर, ओओपी इत्यादि आदि

जाहिर तौर पर किसी को व्यावहारिकता की भावना को बनाए रखने की ज़रूरत होती है परन्तु मैं सूखे की तरफ बहुत भारी पड़ती हूं।


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


मैं इसके बारे में काफी सराहना करता था - जाहिरा तौर पर जहां तक ​​संभव हो, दोहराव से बचने का प्रयास करें, लेकिन अगर आपको दोपहर के पुनर्रचना को बचाने के लिए कभी-कभी 15 लाइनों की कोड की प्रतिलिपि बनाने की आवश्यकता होती है, तो संभवतः जब तक आप डॉन इसकी आदत नहीं बनायेगा

फिर मैंने अपना काम शुरू कर दिया।

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

इसलिए, सभी को पुन: और अब मैं एक धोखा-हटाने कट्टरपंथी हूँ


मैं बहुत कट्टरपंथी था, लेकिन हाल के एक अनुभव ने मुझे और भी अधिक बनाया है, और मुझे उपयोग करने के लिए उपकरणों का एक और सेट दिया है। विशेष रूप से, जैव सूचना विज्ञान से एल्गोरिदम / अवधारणाओं एक नई स्थिति में हम टेबल के बजाय सीएसएस संचालित लेआउट का उपयोग करने के लिए वेब यूआई को अपडेट कर रहे हैं, इसलिए मैं 700 मौजूदा जेएसपी फाइलों का विश्लेषण कर रहा हूं। मैंने कोड की सभी पंक्तियों को डेटाबेस में और 100K कुल लाइनों में रखा, 20K से कम अद्वितीय थे फिर मैं प्रत्येक फाइल को लाइन आईडी के अनुक्रम के रूप में प्रतिनिधित्व करता हूं, और 2 या अधिक पंक्तियों के सामान्य अनुसरणों को ढूंढता हूं; सबसे लंबे समय तक करीब 300 लाइनें जेएसपी फाइलों के बीच दोहराई गईं थीं, और कटे और अतीत के प्रबल मामले थे यही वह जगह है जहां मैं अभी खड़ा हूं, लेकिन मेरी अगली योजना है कि लाइनों के क्रम के रूप में फाइलों को फिर से प्रस्तुत करना या फिर (सामान्य) later_sides, उन्हें सॉर्ट करना, और फिर सॉफ़्ट क्रम के भीतर एक दूसरे के पास फाइलों की तुलना में लेवेनशेटिन तुलना करना। इस फाइल के फजी मेलिंग में मदद करनी चाहिए, जिसमें न केवल सामान्य प्रसंग शामिल हैं, परन्तु बाद में जो एक और इस तरह से बंद हैं


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

कई जगहों में एक ही चीज़ में परिवर्तन करने के लिए याद रखने के अलावा, बहुत कम है।


कोड दोहराव जल्दी से आप में काटने और आप बहुत दर्द का कारण हो सकता है। अगर मुझे डुप्लिकेट कोड (आमतौर पर अन्य लोगों के पुराने कोड से;;) होता है तो मैं इसे तुरंत रीफैक्टर करने की कोशिश करता हूं यह बहुत दुर्लभ है कि यह प्रयास के लायक नहीं है। अब समय व्यतीत करें या आप बाद में ऐसा करने में अधिक समय व्यतीत करेंगे।


मैंने हमेशा इस सिद्धांत का पालन किया है कि पहली अनुलिपि (यानी मूल प्लस एक कॉपी) आमतौर पर निकालने के प्रयास के लायक नहीं है इसका कारण यह है कि मूल प्लस एक कॉपी शायद एक "एक ऑफ" है, और आप काम को सही ठहराने के लिए उन्हें हटाने से पर्याप्त लाभ नहीं लेते हैं।

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

मैं "रिफैक्टरिंग" प्रक्रिया को कॉल करने में संकोच करता हूं, क्योंकि यह एक्सपी कैंप से एक संदेश है, और मैं फोरट्रान और सी के साथ शुरुआती 80 के दशक में इसे वापस कर रहा था।

अच्छा प्रोग्रामिंग अभ्यास उम्रहीन (और आमतौर पर फैशनेबल-कम भी है)।

चीयर्स,

-Richard


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

उदाहरण: इन्वेंट्री प्रबंधन में, किसी आइटम के लिए हाथ में न्यूनतम मात्रा आपके कार्यशील राशियों में मात्रा के बराबर है और सुरक्षा स्टॉक में मात्रा है। सुरक्षा स्टॉक कार्य आरक्षित का आधा हिस्सा है

Function workingReserve(itemCode, someDate)
     ' Inside here is a looping structure that adds up the requirements for the next six weeks (because that's how long it takes between reorder and receipt).
End Function

Function safetyStock(itemCode, someDate)
    safetyStock = workingReserve(itemCode, someDate) / 2
End Function

Function minimumOnHand(itemCode, someDate)
    minimumOnHand = workingReserve(itemCode, someDate) + safetyStock(itemCode, someDate)
End Function

मुझे माफी है कि यह वीबी में लिखा है, लेकिन यह एक एक्सेल VBA फ़ंक्शन से है।

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

Function minimumOnHand(itemCode, someDate)
    minimumOnHand = workingReserve(itemCode, someDate) * 1.5
End Function

वास्तविक कोड में, मेरे पास व्यापार तर्क को समझाने वाले कोड में टिप्पणियां हैं, लेकिन संक्षेप के लिए उन्हें यहां छोड़ दिया है।


जैसा कि पुनर्लेखन या मरम्मत प्रश्न में उल्लेख किया गया है, आप समय-समय पर दोहराव कोड हटाने जैसी कुछ रिफाकोटर कर सकते हैं, जैसा कि आप उनका पता लगाते हैं।

लेकिन मेरा मानना ​​है कि इस प्रकार की "पुनर्लेखन" क्रिया बेहतर है जब एक मेट्रिक द्वारा पता लगाया जाता है , जो कि कोड स्टैटिक विश्लेषण टूल से है , जो:

  • उन डुप्लिकेट कोड का पता लगाता है
  • एक प्रवृत्ति बताता है (जैसे अधिक से अधिक डुप्लिकेट कोड का पता लगाया जाता है)

उस मामले में, एक सुधारात्मक कार्रवाई को प्राथमिकता दी जा सकती है, इस प्रकार के रिफैक्टरिंग पर ध्यान केंद्रित करने के लिए।

दूसरे विचार पर, मुझे आश्चर्य है कि क्या मैं QA आदमी जिग हो सकता है ;-) की बात कर रहा है