कोई स्पष्ट अमूर्त के साथ कोड दोहराव


14

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

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

आपको क्या लगता है कि कुछ इस तरह से संबोधित करना सबसे अच्छा तरीका है?

जवाबों:


18

कभी-कभी कोड दोहराव "दंड" का परिणाम होता है: दो चीजें समान दिखती हैं, लेकिन ऐसा नहीं है।

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

जब आपको लगा कि स्थिर था, तो रिफैक्टरिंग आवश्यक है (जैसे यह एपीआई कॉल हमेशा दो तर्क लेगा) को बदलने की आवश्यकता है।

इसलिए, इन दो डुप्लिकेट कोड के टुकड़े के लिए, मैं पूछूंगा: क्या एक के लिए आवश्यक बदलाव का मतलब है कि दूसरे को भी बदलना होगा?

आप इस सवाल का जवाब कैसे दे सकते हैं कि एक अच्छा अमूर्त क्या हो सकता है।

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

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

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


4

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

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


एक तंग जगह में संकुचित कई उत्कृष्ट तकनीकों के लिए +1। (खैर, वर्णित तकनीकों के लिए +1 रहा होगा।)
मेकनील

3

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


2

कोड सैंपल के बिना, यह कहना मुश्किल है कि आपके कोड में आसानी से पहचान योग्य अमूर्तता क्यों नहीं है। उस चेतावनी के साथ, यहाँ कुछ विचार हैं:

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

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

अपने फ़ंक्शन हस्ताक्षर की पहचान करके छोटे कोड के टुकड़ों को कैसे अमूर्त बनाएं, और बड़े टुकड़ों को वर्गीकृत करना आसान होना चाहिए।

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