डुप्लिकेट कोड (सामान्य रूप से) कैसे निकालें?


10

एक OO भाषा में (उदाहरण के लिए, लेकिन जावा तक सीमित नहीं) आप डुप्लिकेट कोड को ठीक कैसे करते हैं, यह घटना के दायरे के आधार पर तय करता है? मैं (उदाहरण के लिए) के साथ शुरू होगा

  • समान श्रेणी (कार्यक्षेत्र) में एक्सट्रैक्ट मेथड रीफैक्टरिंग (फिक्स) करें
  • समान श्रेणी के वर्गों में (कार्यक्षेत्र) एक्सट्रैक्ट मेथड और पुल अप (फिक्स) का प्रदर्शन करते हैं
  • ...

DRY सिद्धांत को लागू करने के लिए एक उदाहरण देखें (अपने आप को दोहराएं नहीं) इस पर एक ही कक्षा के साथ: geekswithblogs.net/chrisfalter/archive/2008/03/07/…
NoChance

SO पर मूल प्रश्न ( stackoverflow.com/questions/7380946/… ) बंद हो गया। इसलिए मैंने इसे यहां स्थानांतरित किया।
पीटर कोफ्लर

जवाबों:


8

हाल ही में मुझे अंकल बॉब के "क्लीन कोड" में मेरे प्रश्न का अच्छा उत्तर मिला, जिसे मैं साझा करना चाहता हूं। वह तीन प्रकार के दोहराव को अलग करता है

समान कोड के टुकड़ों को एक ही विधि से बदला जाना चाहिए। तो यह तरीका विधि को निकालने और सामान्य व्यवहार को सौंपना होगा।

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

के मामले switch/caseऔर if/elseवह हमेशा स्थितियों के एक ही सेट के लिए परीक्षण करते हैं

  • इन्हें बहुरूपता से बदला जाना चाहिए।

मॉड्यूल जो समान एल्गोरिदम को लागू करते हैं । ये खोजने में सबसे कठिन हैं, क्योंकि कोई भी क्लोन डिटेक्टर इन्हें नहीं ढूंढ सकता है।

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

पुस्तकालयों के विभिन्न संस्करणों के साथ काम करते समय ओड द्वारा उल्लिखित एक मान्य बिंदु भी

  • एक एकल संस्करण पर समेकित करें। मुखौटा डिजाइन पैटर्न यहाँ मदद कर सकता है।

अंत में मेरे सवाल का जवाब देने के लिए सबसे अच्छा एक वाक्य है:

OO भाषाओं में प्रयुक्त कोड पुन: उपयोग विधि ऑब्जेक्ट है।


5

सामान्य तौर पर - डुप्लिकेट कोड को एक ही स्थान पर समेकित करें और सुनिश्चित करें कि मूल डुप्लीकेशन साइट समेकित स्थान को बुला रही है।

आपके उदाहरणों में, एक वर्ग के भीतर यह निकाली गई विधि होगी और कक्षाओं के एक सेट के भीतर बेस क्लास के भीतर खींच-अप विधि होगी।

कॉपी-पेस्ट कोड में, यह डुप्लिकेट को हटाने और यह सुनिश्चित करने के लिए होगा कि कोई भी उपयोगकर्ता अब एकल कॉपी का उपयोग करें (जो भी इस स्तर पर है)।

पुस्तकालयों के विभिन्न संस्करणों के साथ काम करते समय, एकल संस्करण (यदि संभव हो) पर समेकित करें।


यदि यह बेस क्लास में है, तो क्या यह "पुल-डाउन" विधि नहीं होगी? मैं हमेशा आधार वर्गों की कल्पना शारीरिक रूप से व्युत्पन्न वर्गों के तहत करता हूं।
डेव नी

Refactoring किताब से उचित नाम "पुल अप" है।
पीटर कोफ्लर

1

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

तीन का नियम पहली बार जब आप कुछ करते हैं, तो आप इसे करते हैं। दूसरी बार जब आप कुछ ऐसा ही करते हैं, तो आप दोहराव पर ध्यान केंद्रित करते हैं, लेकिन आप वैसे भी नकल करते हैं। तीसरी बार जब आप कुछ ऐसा ही करते हैं, तो आप रिफ्लेक्टर करते हैं।

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


1
"तीन का नियम" के बारे में +1। मैं हमेशा आश्चर्यचकित हूं कि यह कितने व्यापक रूप से लागू है।
एंडी आम

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