DRY असंबंधित, लेकिन लगभग समान, कोड


34

मेरे पास कुछ कोड है जो लगभग समान है, लेकिन बिल्कुल भिन्न प्रकार का उपयोग करता है, मुख्य चर पर उन दोनों के बीच कोई विरासत नहीं है। विशेष रूप से, मैं निम्न प्रकार के साथ C # और VB.NET के लिए रोजलिन के साथ एक विश्लेषक लिख रहा हूं:

Microsoft.CodeAnalysis.CSharp.Syntax.AttributeSyntax Microsoft.CodeAnalysis.VisualBasic.Syntax.AttributeSyntax

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

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


क्या यह आपके स्वयं के एट्रीब्यूट्स सिन्टेक्स इंटरफ़ेस को बनाने के लिए काम करेगा जो मौजूदा कक्षाओं को लपेटता है लेकिन आपको वह विरासत देता है जो वैचारिक रूप से होनी चाहिए?
विंस्टन एवर्ट

7
यदि यह स्पष्ट है, तो क्षमा करें, लेकिन जेनेरिक मौजूद हैं इसलिए आपको कोड के लिए खुद को दोहराना नहीं है जो समान है लेकिन प्रकार के लिए है। यदि आपका मतलब यह नहीं है, तो कृपया अवहेलना करें।
डेविस्लर

@ लॉरेहेड आमतौर पर मैं ऐसा करता हूं, लेकिन यह एक एकल विधि है जिसे एक प्रकार से पारित किया जा रहा है जिसमें एक आंतरिक विधि से पेलोड के रूप में नोड होता है जिस पर मेरा कोई नियंत्रण नहीं है।
होसच २५

@WinstonEwert मैं उस पर गौर करूंगा। मुझे यकीन नहीं है कि मैं ऐसा सभी C # / VB.NET प्रकारों के लिए करना चाहता हूं।
होसच २५

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

जवाबों:


111

आप DRY नहीं करते हैं क्योंकि किसी ने इसे एक किताब में कहीं लिखा है कि यह करना अच्छा है, आप DRY करते हैं क्योंकि यह वास्तव में मूर्त लाभ है।

विशेष रूप से उस प्रश्न से:

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

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

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


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


32
TL; DR - DRY एक अंत का साधन है। अंत पर ध्यान केंद्रित करें, साधन नहीं। अगर मैं लेगो मैन को दो बार उकसा सकता हूं, तो मैं करूंगा।

एक महत्वपूर्ण नोट: यदि आप करते हैं अपने आप को दोहराने, हमेशा टिप्पणी में उल्लेख अन्य सभी स्थानों है कि दौरा किया जा करने के लिए जब बार-बार कोड बदल जाता है। न केवल यह एक desync की संभावना को कम करता है, यह एक संकेतक के रूप में भी काम करता है कि दोहराव आपके लिए कितना रखरखाव दर्द पैदा कर रहा है।
जिओन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.