बहुत से उदाहरण चर होने से डुप्लिकेट कोड कैसे बनते हैं?


19

पैटर्न के लिए रिफैक्टरिंग के अनुसार :

जब कोई वर्ग बहुत अधिक करने की कोशिश कर रहा होता है, तो वह अक्सर बहुत से उदाहरण चर दिखाता है। जब एक वर्ग में बहुत सारे उदाहरण चर होते हैं, तो डुप्लिकेट कोड बहुत पीछे नहीं रह सकता है।

बहुत से उदाहरण चर होने से डुप्लिकेट कोड कैसे बनते हैं?


2
सीधे शब्दों में कहें: nबूलियन चर उदाहरण के लिए एक आंतरिक स्थिति बनाते हैं 2^n। अधिक बार नहीं, हालांकि आपकी वस्तु में कई अवलोकन योग्य राज्य नहीं हैं , लेकिन क्योंकि आपने उस सभी अवस्था को एक ही वस्तु में बदल दिया है, आंतरिक रूप से आपको अभी भी उन सभी को संभालना है।
biziclop

जवाबों:


23

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

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

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


11

बहुत सारे उदाहरण चर का मतलब बहुत अधिक राज्य है। बहुत अधिक राज्य डुप्लिकेट कोड की ओर जाता है जो प्रत्येक राज्य के लिए थोड़ा अलग है।

यह क्लासिक एकल ठोस वर्ग है जो बहुत सारी चीजें कर रहा है जो उप-वर्ग या रचनाएं होनी चाहिए।

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

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


7

आपके द्वारा दिए गए कथन का अर्थ किसी विशिष्ट संदर्भ में देखा जाना है।

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

http://c2.com/cgi/wiki?CodeSmell

मनोरंजक रूप से, आपको "बहुत अधिक उदाहरण चर" के रूप में "बहुत कम उदाहरण चर" के रूप में एक कोड गंध अच्छा है।

लेकिन उदाहरण चर के साथ समस्याएं हैं, बहुत कम या बहुत अधिक हो:

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

  2. हर उदाहरण चर की आपको निगरानी रखने की आवश्यकता होती है कि कौन सी विधियाँ चर को किस तरीके से बदलती हैं। तो, अचानक, आप खाना पकाने वाले सभी रसोइयों को नहीं जानते हैं। उनमें से एक, जो देर रात में थके हुए प्रोग्राम करता है, आपके सूप को खराब कर देगा। फिर से: इस तरह के बहुत से वेरिएबल कोड को घुसना मुश्किल बना देंगे।

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

  4. अंतिम लेकिन कम से कम नहीं: यदि किसी वर्ग के कई उदाहरणों में उनके सेटर और गेट्टर प्रत्येक हैं, तो यह संकेत दे सकता है कि अन्य वर्ग इस प्रथम श्रेणी का सही तरीके से उपयोग नहीं करते हैं। " क्यों गेटर्स और सेटरर्स बुराई हैं " के बारे में चर्चा है । संक्षेप में विचार यह है कि यदि एक वर्ग Rectangleकुछ प्रदान करता है getX(), और दर्जनों अन्य वर्ग उपयोग करते हैं rectangle.getX(), तो आप कोड लिख रहे हैं जो "लहर प्रभाव" के खिलाफ मजबूत नहीं है (अन्य कोड को प्रभावित करने वाला कोड परिवर्तन कितना दूर है)। बस यह पूछें कि यदि आप टाइप intको doubleकिस से बदलते हैं तो क्या होता है ? इस चर्चा के अनुसार, कई rectangle.getX()कॉल वास्तव में कॉल की तरह बेहतर होनी चाहिएrectanlge.calculateThisThingForMe()। इसलिए, बहुत ही परोक्ष रूप से, डुप्लिकेट किए गए कोड कई उदाहरण चर से उभर सकते हैं, क्योंकि कई कक्षाएं आसपास कई गेटर्स का उपयोग करती हैं और बहुत समान चीजें, यानी कॉपी की गई चीजों को करने के लिए बसती हैं, जिन्हें बेहतर तरीके से कक्षा के अंदर ले जाना चाहिए।

कई या कुछ उदाहरण चर एक स्थायी व्यापार बंद रहता है, दोनों तरीकों में फेरबदल करते हुए सॉफ्टवेयर बढ़ रहा है।


आर-टू-पी उद्धरण बहुत सामान्य है यही कारण है कि मुझे यह उत्तर पसंद है। मेरा लेना-देना है: यदि हम एक ग्राहक के लिए पर्याप्त गुणों को उजागर कर सकते हैं, और करेंगे, तो उन लोगों को ले लें और लिख दें कि यह किसी दिए गए कार्यक्षमता का अपना संस्करण है - 4 या इससे अधिक। यह समस्या ऑब्जेक्ट कंपोज़िशन जितनी गहरी हो सकती है - # 2 देखें: मुझे यह अक्सर हमारे कोड में दिखाई देता है। (ए) "उन्होंने इस असंगठित राज्य के कुछ भी (<>> वर्ग का उपयोग क्यों नहीं किया?" या (बी) "उन्होंने एक नया वर्ग क्यों नहीं बनाया? मैं यह सब नहीं देख सकता।" और सुनिश्चित करें कि हमारे पास सुसंगत वर्ग की कमी के लिए आंतरिक रूप से दोहराव वाली कई कक्षाएं हैं।
राडारबॉब

6

सीधे शब्दों में कहें: कोड के भीतर चिंताओं का खराब पृथक्करण, ऐसे कोड की ओर जाता है जो मॉड्यूलर नहीं है, खराब पुन: उपयोग की ओर जाता है, डुप्लिकेट कोड की ओर जाता है।

यदि आप कार्यक्षमता को दोहराने की कोशिश नहीं करते हैं, तो आपको डुप्लिकेट कोड नहीं मिलेगा, और कई उदाहरण चर, समस्या नहीं होगी।

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

तो कई उदाहरण चर के रूप में ही समस्या का मूल कारण नहीं है यह एक मजबूत "गंध" है कि समस्या आ रही है।

भाषा "पीछे नहीं हो सकती है" यह कहने से कमजोर है कि "निश्चित रूप से पालन करना चाहिए" इसलिए लेखक यह दावा नहीं कर रहा है कि ऐसा होना चाहिए लेकिन अंततः होगा; यदि आपको कार्यक्षमता का पुन: उपयोग करने की आवश्यकता है लेकिन कोड मॉड्यूलर नहीं है।

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