क्या विधि मापदंडों का पुन: उपयोग करना बुरा है?


12

ऐसे समय होते हैं, जब मुझे किसी पद्धति में से किसी विधि में दिए गए मान को संशोधित करना होगा। एक उदाहरण इस विधि के रूप में एक स्ट्रिंग sanitizing होगा:

void SanitizeName(string Name)
{
    Name = Name.ToUpper();

    //now do something here with name
}

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

इसलिए, मैं तर्क को पुन: सौंपने के बजाय, मैं हमेशा एक स्थानीय प्रतिलिपि बनाता हूं जैसे:

void SanitizeName(string Name)
{
    var SanitizedName = Name.ToUpper();

    //now do something here with name
}

इससे यह सुनिश्चित होता है कि मूल्य में परिवर्तन करने वाली थ्रू को पारित कर दिया जाता है और यह विधि के बाहर जाने वाले को कभी प्रभावित नहीं करेगा, लेकिन मैं सोच रहा हूं कि क्या मैं इस बारे में अत्यधिक पागल हो रहा हूं।


1
हाँ, यह बुरा अभ्यास है; और नहीं यह हानिरहित नहीं है। परिवर्तन Name = Name.ToUpper();के मूल्य के रूप में लाइन आपके सिर में अनुसरण करने के लिए कोड को कठिन बनाती है Name। आपका दूसरा उदाहरण केवल भविष्य का प्रमाण नहीं है, यह क्या करना है, इसका कारण आसान है।
डेविड अरनो

2
लेकिन इससे क्या if (param == NULL) param = default_value;?
आर्गेनर

मुझे लगता है कि यह हां / नहीं जितना आसान नहीं है।
MrSmith42

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

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

जवाबों:


10

मुझे लगता है कि यह आपकी परियोजना में आपके कोडिंग सम्मेलनों पर निर्भर करता है।

मैंने व्यक्तिगत रूप finalसे प्रत्येक चर और पैरामीटर में कीवर्ड को स्वचालित रूप से जोड़ने की अनुमति दी है । इस तरह से आप पहली नज़र में देखते हैं अगर कोई पैरामीटर पुन: उपयोग किया जाता है।

मेरी नौकरी पर परियोजना में हम मापदंडों का पुन: उपयोग करने की अनुशंसा नहीं करते हैं, लेकिन यदि आप .trim()किसी nullमामले में उदाहरण के लिए कॉल करना चाहते हैं या डिफ़ॉल्ट सेट करना चाहते हैं , तो हम पैरामीटर का सबसे अधिक बार पुन: उपयोग करते हैं, क्योंकि एक नया चर पेश करना ऐसे मामलों में कम पठनीय है पैरामीटर के पुन: उपयोग से।

आपको वास्तव में एक बहुत भिन्न सामग्री को संग्रहीत करने के लिए पैरामीटर का पुन: उपयोग नहीं करना चाहिए क्योंकि नाम अब उसकी सामग्री को संदर्भित नहीं करेगा। लेकिन यह एक चर के प्रत्येक पुनर्मूल्यांकन के लिए सच है और मापदंडों तक सीमित नहीं है।

तो अपनी टीम के साथ मिलें और कोडिंग कन्वेंशन तैयार करें जो इस मामले को कवर करे।


0

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


आप ज्यादातर मामलों में कोड एनालाइज़र को इंगित करने के लिए किसी तरह के एनोटेशन या विशेष टिप्पणी का उपयोग कर सकते हैं कि यह इरादा है और किसी का ध्यान नहीं है।
MrSmith42

0

इसका उत्तर इस बात पर निर्भर करता है कि आपका कोड पढ़ने वाला 100% है। वे किस शैली को सबसे अधिक उपयोगी पाते हैं?

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

कहा जा रहा है, मानसिक मॉडल बदल जाते हैं। आपके विशेष विकास के माहौल में, name"इस समय इस नाम का सबसे अच्छा प्रतिनिधित्व" होना वांछनीय हो सकता है । यह अधिक स्पष्ट रूप से उन चर को जोड़ने के लिए वांछनीय हो सकता है जो आप उनके तर्कों पर काम कर रहे हैं, भले ही आपने रास्ते में उनके मूल्यों में कुछ संशोधन किए हों। अधिक भारी वस्तुओं को बनाने के बजाय कुछ विशेष चर का पुन: उपयोग करने के लिए पर्याप्त रनटाइम फायदे भी हो सकते हैं। आखिरकार, जब आप 4 जीबी स्ट्रिंग्स के साथ काम कर रहे होते हैं, तो आपके द्वारा बनाई गई अतिरिक्त प्रतियों की संख्या को कम करना अच्छा होता है!


-1

मुझे आपके कोड उदाहरण के साथ पूरी तरह से अलग समस्या है:

आपका विधि का नाम है SanitizeName। इस मामले में, मुझे उम्मीद है कि यह एक नाम को पवित्र करेगा ; क्योंकि वह है, जो आप अपने फ़ंक्शन के पाठक को बताते हैं।

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

string SanitizeName(string Name)
{
    //somehow sanitize the name
    return Result;
}

लेकिन आप का मतलब है, कि आपका तरीका केवल sanitizng से थोड़ा अधिक है । यह एक कोड गंध है और इससे बचा जाना चाहिए।

आपका प्रश्न इस बारे में नहीं है: क्या पद्धति के मापदंडों का पुन: उपयोग करना बुरा है? यह अधिक है: साइडइफ़ेक्ट्स और अनएक्सपेक्टेड व्यवहार बुरा अभ्यास है?

उस का जवाब स्पष्ट है: हाँ!

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

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

समस्या कम है पुन: उपयोग की तुलना में sideeffectsसाइडइफेक्ट्स को रोकने के लिए एक चर का पुन: उपयोग न करें । यदि आपके पास कोई साइडइफेक्ट नहीं है, तो कोई समस्या नहीं है।


4
-1 यह मूल प्रश्न का उत्तर नहीं देता है। प्रदान किया गया कोड हाथ में प्रश्न दिखाने के लिए सिर्फ एक नमूना कोड है। कृपया दिए गए नमूना कोड की "हमला" / समीक्षा करने के बजाय, प्रश्न का उत्तर दें।
निकल्स एच।

1
@NiklasH यह सवाल का पूरी तरह से जवाब देता है: यदि आप फ़ंक्शन के अंदर पैरामीटर में हेरफेर करते हैं और जैसा कि उल्लेख किया गया है तो आप गलती से एक कॉपी के बजाय एक संदर्भ के साथ काम करते हैं, इससे साइड इफेक्ट्स होते हैं (जैसा कि मैंने कहा) और यह खराब है। यह रोकने के लिए कि यह इंगित करें कि आप विधि नाम (रूबी के 'के बारे में सोचें) और / या रिटर्न प्रकार का चयन करके वेरिएबल को सावधानी से बदलने जा रहे हैं। यदि आप परिवर्तनशील परिवर्तन नहीं करते हैं, तो केवल प्रतियों के साथ काम करें।
थॉमस जंक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.