2010-07-14 17 views
5

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

उदाहरण के लिए:

public void MethodA(object o){ 
    if(null == o){ 
     throw new ArgumentNullException("o"); 
    } 
    // Do some thing unrelated to o 

    MethodB(o); 

    // Do some thing unrelated to o 

} 

public void MethodB(object o){ 
    if(null == o){ 
     throw new ArgumentNullException("o"); 
    } 
    // Do something with o 
} 

एक पैरामीटर का उपयोग करता है Method, तो इसकी स्पष्ट, मैं MethdoB में वहाँ और भी वैधता की जांच करने के लिए है। लेकिन जब तक मेथड MethodB को देने से o के साथ कुछ और नहीं करता है, तो MethodA में वैधता की जांच करना भी अच्छा अभ्यास है।

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

मैंने शून्य उदाहरण को एक उदाहरण के रूप में लिया, लेकिन इंडेक्स-सत्यापन या सीमा सत्यापन स्वयं प्रश्न में पड़ते हैं, हालांकि मुझे लगता है कि अनावश्यक कोड के खतरे की वजह से सीमाएं हैं। तुम क्या सोचते हो?

अद्यतन

AakashM का जवाब मैंने देखा है कि मैं करने के लिए कम सटीक था के माध्यम से। MethodA न केवल MethodB पर कॉल करता है, यह अन्य चीजें भी करता है लेकिन o से संबंधित नहीं है। मैंने इसे स्पष्ट करने के लिए एक उदाहरण जोड़ा। धन्यवाद आकाशम।

उत्तर

9

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

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

आपके उदाहरण में, MethodBpublic है। इसका मतलब है कि आपके पास कोई स्वचालित भविष्य गारंटी नहीं है कि MethodA उसका एकमात्र कॉलर होगा - इसलिए मैं कहूंगा कि इसका सत्यापन कोड रहना चाहिए। यदि कक्षा में private थे, हालांकि, आप इसे हटाने के लिए तर्क दे सकते हैं।

MethodA का सवाल है, अगर यह वास्तव में कुछ भी नहीं कॉल MethodB की तुलना में अधिक होता है, यह अस्तित्व में नहीं करना चाहिए। यदि यह भविष्य के विस्तार के लिए एक स्टब है, और किसी बिंदु पर यह o के साथ कुछ करने जा रहा है, तो इसका सत्यापन कोड भी रहना चाहिए।

1

मुझे लगता है कि आपको इसे एक बार सुनिश्चित करना चाहिए जहां इनपुट मूल्य उत्पन्न होता है (कॉलर की ज़िम्मेदारी)। यह काम करता है अगर कक्षा केवल आंतरिक ग्राहकों द्वारा उपयोग की जाती है। यदि यह सार्वजनिक एपीआई का हिस्सा है, तो आप चेक का विस्तार नहीं कर सकते हैं, लेकिन आप अन्य उत्तरों में सुझाए गए अनुसार उन्हें कारक बनाना चाहेंगे।

परीक्षण उद्देश्यों के लिए, आप दोनों विधियों में Debug.Assert(o != null) का भी उपयोग कर सकते हैं और यदि प्रदर्शन एक समस्या है रिलीज कोड, से हटा दिया जाएगा।

+0

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

+0

हाँ। मेरा संपादन देखें। – Mau

1

मुझे पैरामीटर सत्यापन "अनावश्यक कोड" पर विचार नहीं है। आपको सभी बाहरी प्रवेश बिंदुओं की रक्षा करने की आवश्यकता है। यदि आपके पास private विधि है, तो आप जानते हैं कि समय प्रवाह के कारण यह पता चलता है कि इसके सभी पैरामीटर मान्य होने जा रहे हैं, तो आपके पास शायद एक मामला है, लेकिन public (और यहां तक ​​कि protected) विधियों के लिए आप वास्तव में नहीं करते हैं।

संबंधित मुद्दे