मैं सिंगल रिस्पांसिबिलिटी प्रिंसिपल (एसआरपी) का यथासंभव पालन करने की कोशिश कर रहा हूं और प्रतिनिधियों पर भरोसा करने के लिए एक निश्चित पैटर्न (तरीकों पर एसआरपी के लिए) के लिए उपयोग किया जाता है। मैं जानना चाहूंगा कि क्या यह दृष्टिकोण ध्वनि है या यदि इसके साथ कोई गंभीर समस्या है।
उदाहरण के लिए, एक कंस्ट्रक्टर के लिए इनपुट की जांच करने के लिए, मैं निम्नलिखित विधि पेश कर सकता हूं ( Stream
इनपुट यादृच्छिक है, कुछ भी हो सकता है)
private void CheckInput(Stream stream)
{
if(stream == null)
{
throw new ArgumentNullException();
}
if(!stream.CanWrite)
{
throw new ArgumentException();
}
}
यह विधि (यकीनन) एक से अधिक काम करती है
- इनपुट्स की जाँच करें
- अलग-अलग अपवादों को फेंक दो
एसआरपी का पालन करने के लिए मैंने इसलिए तर्क को बदल दिया
private void CheckInput(Stream stream,
params (Predicate<Stream> predicate, Action action)[] inputCheckers)
{
foreach(var inputChecker in inputCheckers)
{
if(inputChecker.predicate(stream))
{
inputChecker.action();
}
}
}
जो माना जाता है कि केवल एक ही चीज़ करता है (यह करता है?): इनपुट की जाँच करें। इनपुट्स की वास्तविक जाँच के लिए और अपवादों को फेंकने के तरीके जैसे मैंने पेश किए हैं
bool StreamIsNull(Stream s)
{
return s == null;
}
bool StreamIsReadonly(Stream s)
{
return !s.CanWrite;
}
void Throw<TException>() where TException : Exception, new()
{
throw new TException();
}
और CheckInput
पसंद कर सकते हैं
CheckInput(stream,
(this.StreamIsNull, this.Throw<ArgumentNullException>),
(this.StreamIsReadonly, this.Throw<ArgumentException>))
क्या यह पहले विकल्प से बिल्कुल भी बेहतर है, या क्या मैं अप्राकृतिक जटिलता का परिचय देता हूं? क्या कोई तरीका है जो मैं अभी भी इस पैटर्न को बेहतर बना सकता हूं, अगर यह बिल्कुल भी व्यवहार्य है?
CheckInput
अभी भी कई काम कर रहे हैं: यह दोनों एक सरणी पर पुनरावृत्ति कर रहा है और एक विधेय फ़ंक्शन को कॉल कर रहा है और एक क्रिया फ़ंक्शन को कॉल कर रहा है। क्या तब यह एसआरपी का उल्लंघन नहीं है?