2012-03-06 19 views
12

सवाल पता चलता है,string.IsNullOrEmpty (myString) या string.IsNullOrWhiteSpace (myString) एसआरपी नियम का उल्लंघन नहीं कर रहा है?

हम कार्यों शो के नाम के रूप में IsNullOrEmpty या IsNullOrWhiteSpace तरह स्ट्रिंग कार्यों का उपयोग कर रहे हैं, ये एक से अधिक काम कर रहे हैं, यह SRP का उल्लंघन नहीं है?

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

या यूटिलिटी क्लास या स्थैतिक कक्षाओं में एसआरपी का उल्लंघन करना बिल्कुल ठीक है।

+3

इसे ओवरथिंक न करें, ये कार्य ठीक हैं। – ken2k

+0

:), बिल्कुल, आप सही हैं लेकिन कभी-कभी यह मुझे बहुत भ्रमित करता है इसलिए मैंने इस बार सोचा, मैं industroy विशेषज्ञों से पूछता हूं। – TalentTuner

+0

मुझे लगता है कि इन 2 कार्यों में कुछ भी पैटर्न जोड़ने से आपके कोड की भ्रम और पठनीयता बढ़ जाती है। बस इसे सरल रखें (बेवकूफ) – Alex

उत्तर

16

एसआरपी का कहना है कि एक समारोह या कक्षा में बदलने का केवल एक कारण होना चाहिए। बदलने का कारण क्या है? बदलने का एक कारण एक उपयोगकर्ता है जो परिवर्तन का अनुरोध करता है। इसलिए किसी वर्ग या फ़ंक्शन में केवल एक उपयोगकर्ता होना चाहिए जो परिवर्तनों का अनुरोध करता हो।

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

IsNullOrEmpty (स्ट्रिंग) दो अलग-अलग उपयोगकर्ताओं की सेवा करने की संभावना नहीं है। उपयोगकर्ता जो शून्य के बारे में परवाह करता है वह वही उपयोगकर्ता है जो खाली होने की परवाह करता है, इसलिए NullOrEmpty एसआरपी का उल्लंघन नहीं करता है।

+0

उत्कृष्ट से नीचे है, मुझे वह वास्तव में मिला जो मैं वास्तव में ढूंढ रहा था। – TalentTuner

+0

क्या आपके पास कुछ पुस्तकें नाम हैं या साझा करने के लिए लिंक हैं? – TalentTuner

0

मुझे यह एक से अधिक चीज़ों के रूप में नहीं दिख रहा है। यह सिर्फ यह सुनिश्चित कर रहा है कि आपकी स्ट्रिंग एक आवश्यक शर्त पास करे।

3

ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग में, एकल जिम्मेदारी सिद्धांत के अनुसार हर वस्तु एक भी जिम्मेदारी

आप विधियों का वर्णन कर रहे हैं होना चाहिए: IsNullOrEmpty या IsNullOrWhiteSpace है, जो भी स्वयं का वर्णन क्या कर रहे हैं वे करो, वे वस्तुओं नहीं हैं। string की एक जिम्मेदारी है - पाठ तारों के लिए ज़िम्मेदार होना!

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

+1

क्या आप यह कहना चाहते हैं कि एसआरपी केवल ऑब्जेक्ट्स पर लागू होता है लेकिन संचालन पर नहीं? मैं टिप्पणी से सहमत हूं, इसे ओवरथिंक न करें लेकिन मैं बस अपने भ्रम की पुष्टि करना चाहता हूं। – TalentTuner

+0

हां, एसआरपी एक पुराना ओओ शब्द कहने का एक और तरीका है :) –

+0

लेकिन जैसा कि मैं विश्वास करता हूं कि एसआरपी ऑब्जेक्ट स्तर के साथ-साथ विधि स्तर के लिए मान्य है, दोनों में बदलाव के लिए एक कारण होना चाहिए, कहें कि मैंने सेरिलिज़ और वैलिडेट जैसे फक्शन को लिखा है (ऑब्जेक्टटोसेरिलिज़ और वैलिडेट), स्पष्ट रूप से यह विधि/कक्षा, 2 चीजें कर रही है, सीरिलिज़ और सत्यापन, स्पष्ट रूप से उल्लंघन है, कक्षा में कुछ समय विधियों को सीलिलाइज और सत्यापन के उपरोक्त उदाहरण की तरह दुःस्वप्न बनाए रखने की ओर जाता है – TalentTuner

2

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

IsNullOrEmpty के कार्यान्वयन के बारे में सोचो:

static bool IsNullOrEmpty(string s) 
{ 
    return ReferenceEquals(s, null) || Equals(s, string.Empty); 
} 

तो, हाँ, यह दो बातें कर रहा है, लेकिन वे एक ही अभिव्यक्ति में काम हो गया। आप अभिव्यक्ति के स्तर, पर जाएँ किसी भी बूलियन द्विआधारी बूलियन ऑपरेटरों को शामिल अभिव्यक्ति "एक से अधिक बात कर" क्योंकि वह एक से अधिक शर्त की सच्चाई मूल्यांकन कर रही है कहा जा सकता है।

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

static bool HasNoVisibleCharacters(string s) { return string.IsNullOrWhitespace(s); } 
static bool HasNoCharacters(string s) { return string.IsNullOrEmpty(s); } 

अपनी टिप्पणी के जवाब में:

कहते हैं कि मैं SerilizeAndValidate (ObjectToSerilizeAndValidate) की तरह समारोह में लिखा है, स्पष्ट रूप से इस विधि/वर्ग, स्पष्ट रूप से एक 2 बातें, क्रमानुसार और मान्यता, क्या कर रहा है उल्लंघन, एक कक्षा में कुछ समय के तरीकों serialize और सत्यापन

हाँ, आप इस बारे में चिंतित होने का अधिकार नहीं है की उपरोक्त उदाहरण की तरह रखरखाव दुःस्वप्न की ओर जाता है, लेकिन फिर, आप सचमुच तरीकों है कि नहीं हो सकता केवल एक चीजयाद रखें कि विभिन्न विधियां अमूर्तता के विभिन्न स्तरों से निपटेंगी। आपके पास बहुत उच्च स्तरीय विधि हो सकती है जो क्रियाओं के लंबे अनुक्रम के हिस्से के रूप में SerializeAndValidate पर कॉल करती है। अमूर्तता के उस स्तर पर, SerializeAndValidate को एक ही क्रिया के रूप में सोचना बहुत उचित हो सकता है।

एक फ़ाइल के "गुण" संवाद खोलने के लिए एक अनुभवी उपयोगकर्ता के लिए कदम दर कदम निर्देश का एक सेट लेखन कल्पना कीजिए:

  • राइट-क्लिक करें फ़ाइल
  • चुनें "गुण"

  • स्थिति:

    अब कोई है जो पहले एक माउस का इस्तेमाल कभी नहीं किया है के लिए एक ही निर्देश लेखन कल्पना फ़ाइल के आइकन

  • पर माउस पॉइंटर को सही करें माउस बटन
  • एक मेनू प्रकट होता है। से अधिक शब्द "गुण"
  • प्रेस माउस सूचक रखें और बाईं माउस बटन

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

तरीके आपको "खुद को दोहराएं" सिद्धांत (अक्सर "DRY" के रूप में जाना जाता है) का अनुपालन करने की अनुमति देता है। यदि आपको अपने आवेदन के कई हिस्सों में वस्तुओं को क्रमबद्ध और मान्य करने की आवश्यकता है, तो आप डुप्लीकेटिव कोड को कम करने के लिए SerializeAndValidate विधि चाहते हैं। आप बहुत अच्छी तरह से एक सरल सुविधा पद्धति के रूप में विधि को लागू करने की सलाह दी जा चाहते हैं:

void SerializeAndValidate(SomeClass obj) 
{ 
    Serialize(obj); 
    Validate(obj); 
} 

यह आप एक विधि को बुलाने की सुविधा की अनुमति देता है, जबकि मान्यता तर्क से क्रमबद्धता तर्क की जुदाई, जो कार्यक्रम बनाना चाहिए संरक्षण बनाए रखने के लिए आसान है।

+0

क्रिसस उत्तर में मेरी दूसरी टिप्पणी देखें। – TalentTuner

+0

@ सौरभ मैंने उस टिप्पणी से संबंधित कुछ विचार जोड़े हैं – phoog

+0

:), काफी बहस करने योग्य प्रश्न। मैं आपके तर्क को जोड़ सकता हूं लेकिन आप मेरे लिए बहुत उचित लगते हैं, इसलिए – TalentTuner