मैंने सुना है कि सार्वजनिक विधियों के तर्कों को मान्य करने की सिफारिश की गई है:
- क्या किसी को अशक्त होने की जांच करनी चाहिए, यदि वह अशक्त होने की उम्मीद नहीं करता है?
- क्या एक विधि को इसके मापदंडों को मान्य करना चाहिए?
- MSDN - CA1062: सार्वजनिक विधियों के मान्य तर्क (मेरे पास .NET पृष्ठभूमि है लेकिन प्रश्न C # विशिष्ट नहीं है)
प्रेरणा समझ में आती है। यदि किसी मॉड्यूल का गलत तरीके से उपयोग किया जाएगा, तो हम किसी भी अप्रत्याशित व्यवहार के बजाय तुरंत अपवाद को फेंकना चाहते हैं।
जो मुझे परेशान करता है, वह यह है कि गलत तर्क एकमात्र त्रुटि नहीं है जो मॉड्यूल का उपयोग करते समय की जा सकती है। यदि हम अनुशंसाओं का पालन करते हैं और त्रुटि बढ़ाना नहीं चाहते हैं, तो कुछ त्रुटि परिदृश्य यहां हमें तर्क को जोड़ने की आवश्यकता है:
- आने वाली कॉल - अप्रत्याशित तर्क
- इनकमिंग कॉल - मॉड्यूल एक गलत स्थिति में है
- बाहरी कॉल - अप्रत्याशित परिणाम लौटे
- बाहरी कॉल - अनपेक्षित साइड-इफेक्ट्स (कॉलिंग मॉड्यूल के लिए डबल-एंट्री, अन्य निर्भरता राज्यों को तोड़ना)
मैंने इन सभी स्थितियों को ध्यान में रखते हुए एक विधि के साथ एक सरल मॉड्यूल लिखने की कोशिश की है (क्षमा करें, नहीं- C # लोग):
public sealed class Room
{
private readonly IDoorFactory _doorFactory;
private bool _entered;
private IDoor _door;
public Room(IDoorFactory doorFactory)
{
if (doorFactory == null)
throw new ArgumentNullException("doorFactory");
_doorFactory = doorFactory;
}
public void Open()
{
if (_door != null)
throw new InvalidOperationException("Room is already opened");
if (_entered)
throw new InvalidOperationException("Double entry is not allowed");
_entered = true;
_door = _doorFactory.Create();
if (_door == null)
throw new IncompatibleDependencyException("doorFactory");
_door.Open();
_entered = false;
}
}
अब यह सुरक्षित है =)
यह काफी खौफनाक है। लेकिन कल्पना करें कि दर्जनों तरीकों, जटिल स्थिति और बहुत सारे बाहरी कॉल (हाय, निर्भरता इंजेक्शन प्रेमियों!) के साथ यह वास्तविक मॉड्यूल में कितना डरावना हो सकता है। ध्यान दें कि यदि आप एक मॉड्यूल को कॉल कर रहे हैं जो व्यवहार को ओवरराइड किया जा सकता है (सी # में गैर-सील वर्ग) तो आप एक बाहरी कॉल कर रहे हैं और परिणाम कॉलर के दायरे में अनुमानित नहीं हैं।
ऊपर जा रहा है, सही तरीका क्या है और क्यों? यदि आप नीचे दिए गए विकल्पों में से चुन सकते हैं, तो अतिरिक्त प्रश्नों के उत्तर दें।
पूरे मॉड्यूल उपयोग की जाँच करें। क्या हमें यूनिट परीक्षणों की आवश्यकता है? क्या ऐसे कोड के उदाहरण हैं? क्या निर्भरता इंजेक्शन उपयोग में सीमित होना चाहिए (क्योंकि यह अधिक जाँच तर्क का कारण होगा)? क्या उन चेकों को डिबग-टाइम में स्थानांतरित करना व्यावहारिक नहीं है (रिलीज में शामिल नहीं है)?
केवल तर्कों की जाँच करें। मेरे अनुभव से, तर्क की जाँच - विशेष रूप से अशक्त जाँच - कम से कम प्रभावी जाँच है, क्योंकि तर्क त्रुटि शायद ही कभी जटिल गलतियों और त्रुटि बढ़ जाती है। अधिकांश समय आपको NullReferenceException
अगली पंक्ति में मिलेगा । तो तर्क जांच इतनी खास क्यों है?
मॉड्यूल उपयोग की जाँच न करें। यह काफी अलोकप्रिय राय है, क्या आप समझा सकते हैं कि क्यों?