यदि एक वर्ग एकल जिम्मेदारी सिद्धांत को पूरा करता है तो यह कैसे निर्धारित किया जाए?


34

एकल जिम्मेदारी सिद्धांत उच्च सामंजस्य सिद्धांत पर आधारित है। दोनों के बीच अंतर यह है कि एक अत्यधिक सामंजस्यपूर्ण कक्षाएं जिम्मेदारियों का एक समूह है जो दृढ़ता से संबंधित हैं, जबकि एसआरपी का पालन करने वाली कक्षाओं में सिर्फ एक जिम्मेदारी है।

लेकिन हम यह कैसे निर्धारित करते हैं कि क्या एक विशेष वर्ग जिम्मेदारियों का एक सेट पेश करता है और इस तरह सिर्फ अत्यधिक सामंजस्यपूर्ण है, या क्या इसकी केवल एक जिम्मेदारी है और इस तरह एसआरपी का पालन करता है? दूसरे शब्दों में, यह अधिक या कम व्यक्तिपरक नहीं है, क्योंकि कुछ एक वर्ग को बहुत दानेदार मान सकते हैं (और जैसे कि एसआरपी का पालन करेगा), जबकि अन्य इसे पर्याप्त रूप से दानेदार नहीं मान सकते हैं?



जवाबों:


21

क्यों हाँ यह बहुत व्यक्तिपरक है, और यह कई गर्म, लाल-सामना करने वाले वाद-विवाद प्रोग्रामरों का विषय है।

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

एकमात्र सलाह जो मैं दे सकता हूं, वह यह है: अपने (और अपने सहकर्मियों के) सर्वोत्तम निर्णय का उपयोग करें। और याद रखें कि गलतियों को (आमतौर पर) ठीक किया जा सकता है यदि आप उन्हें जल्द पकड़ लेते हैं।


मेरी इच्छा है कि कंप्यूटर विज्ञान वास्तविक विज्ञान की तरह अधिक था। वास्तविक विज्ञान में विषय का कोई स्थान नहीं है। जबकि SOLID सिद्धांत अपने आप में ठीक हैं, उन्हें व्यक्तिपरकता को कम करने और निष्पक्षता को अधिकतम करने की आवश्यकता है। यह अभी तक नहीं हुआ है, जो मुझे वास्तविक दुनिया में उनकी वैधता पर सवाल उठाता है।
डार्कनर्टन

13

बॉब मार्टिन (अंकल बॉब), जिन्होंने एसआरपी के पहले ठोस सिद्धांतों की उत्पत्ति की, जो इस बारे में कहते हैं (मैं इस बारे में चर्चा कर रहा हूं, वास्तविक शब्दों को याद नहीं कर सकता):

एक वर्ग को बदलने का केवल एक कारण होना चाहिए

यदि इसका एक से अधिक कारण है, तो यह SRP का पालन नहीं करता है।


14
यह सिर्फ परिभाषा को सच में दोहरा रहा है, लेकिन वास्तव में srp का पालन अभी भी बहुत व्यक्तिपरक है।
एंडी

7

मैं तुम्हें अंगूठे के कई नियम दे सकता हूं।

  • कक्षा को नाम देना कितना आसान है? अगर किसी वर्ग का नाम लेना मुश्किल है, तो वह शायद बहुत ज्यादा कर रहा है।
  • कक्षा के पास कितने सार्वजनिक तरीके हैं? 7 +/- 2 अंगूठे का एक अच्छा नियम है। यदि कक्षा में इससे अधिक है, तो आपको इसे कई वर्गों में विभाजित करने के बारे में सोचना चाहिए।
  • क्या अलग-अलग संदर्भों में उपयोग किए जाने वाले सार्वजनिक तरीकों के एकजुट समूह हैं?
  • कितने निजी तरीके या डेटा सदस्य हैं? यदि कक्षा में एक जटिल आंतरिक संरचना है, तो आपको संभवतः इसे फिर से भरना चाहिए ताकि आंतरिक को अलग-अलग छोटी कक्षाओं में पैक किया जाए।
  • और अंगूठे का सबसे आसान नियम: वर्ग कितना बड़ा है? यदि आपके पास एक एकल वर्ग वाली C ++ हैडर फ़ाइल है जो सौ से अधिक लाइनों के जोड़े से अधिक है, तो आपको संभवतः इसे विभाजित करना चाहिए।

2
अपने दूसरे बिंदु के बारे में, देखें uxmyths.com/post/931925744/…
कैमरन मार्टिन

7
7 +/- 2 के बारे में दृढ़ता से असहमत हैं - एकल जिम्मेदारी सिद्धांत अर्थमेटिक सामंजस्य के बारे में है, न कि मनमानी संख्याओं के बारे में।
जैक्सबी

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

@CameronMartin आपके सेटअप के आधार पर, क्लास के लिए इंटरफ़ेस आपके पढ़ने के लिए आसानी से उपलब्ध हो सकता है या नहीं भी हो सकता है। यूआई की खोज करना शायद ही कोड लिखने जैसा है - अगर मुझे हर मिनट प्रलेखन से परामर्श करना है, तो मुझे कम से कम, किसी भी वास्तविक कार्य को करने में लगने वाले समय को दोगुना करना होगा।
क्लीयर

6

सिंगल रिस्पांसिबिलिटी प्रिंसिपल्स का कहना है कि प्रत्येक सॉफ्टवेयर मॉड्यूल को बदलने का केवल एक कारण होना चाहिए। हाल ही के एक लेख में अंकल बॉब ने "बदलने का कारण" समझाया,

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

उन्होंने आगे यहां एक उदाहरण के साथ अवधारणा को समझाया ।


यह एक शानदार लेख है, जो खुद आदमी ने लिखा है।
मृदुपन

4

इसका उत्तर देने के लिए, एक कदम पीछे हटें और एकल जिम्मेदारी सिद्धांत के इरादे पर विचार करें । यह पहली जगह में अनुशंसित डिजाइन सिद्धांत क्यों है?

सिद्धांत का उद्देश्य कोड आधार को "कम्पार्टमेंटलाइज़" करना है, इसलिए एक एकल "जिम्मेदारी" से संबंधित कोड को एक इकाई में अलग किया जाता है। इससे कोड को ढूंढना और समझना आसान हो जाता है, और इससे भी महत्वपूर्ण बात यह है कि इसका मतलब है कि "जिम्मेदारी" में परिवर्तन केवल कोड की एक इकाई को प्रभावित करेगा।

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

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


2

OO का कहना है कि कक्षाएं डेटा की कार्यक्षमता का एक समूह हैं। यह परिभाषा व्यक्तिपरक व्याख्या के लिए बहुत जगह छोड़ती है।

हम जानते हैं कि कक्षाएं स्पष्ट रूप से और आसानी से परिभाषित होनी चाहिए। लेकिन, ऐसी कक्षा को परिभाषित करने के लिए, हमें इस बात की स्पष्ट धारणा रखनी होगी कि एक वर्ग समग्र डिजाइन में कैसे फिट बैठता है। झरना प्रकार की आवश्यकताओं के बिना, जो विरोधाभासी रूप से, एक विरोधी पैटर्न माना जाता है ... यह प्राप्त करना मुश्किल है।

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

एक बुनियादी वास्तुकला के साथ, उन मामलों की पहचान करना आसान है जहां एकल जिम्मेदारी नियम तोड़े जा रहे हैं। ईजी एक उपयोगकर्ता नियंत्रण के एक मॉडल के लिए एक उदाहरण गुजर रहा है।


1

सिर्फ चर्चा के लिए, मैं JUCE से AudioSampleBuffer नामक एक क्लास लाऊंगा । अब यह वर्ग ऑडियो के स्निपेट (या शायद लंबे समय तक स्निपेट) रखने के लिए मौजूद है। यह चैनलों की संख्या, नमूनों की संख्या (प्रति चैनल) जानता है, ऐसा लगता है कि 32-बिट IEEE फ़्लोट करने के बजाय एक वैरिएबल संख्यात्मक प्रतिनिधित्व या शब्दबद्ध होने के लिए प्रतिबद्ध है (लेकिन यह मेरे साथ कोई समस्या नहीं है)। ऐसे सदस्य कार्य हैं जो आपको किसी विशेष चैनल के अंक या अंक और अंक प्राप्त करने की अनुमति देते हैं। आप एक AudioSampleBuffer को लंबा या छोटा कर सकते हैं। मैं पूर्व के शून्य-पैड को बफर मान लेता हूं जबकि बाद वाला ट्रंकसेट करता है।

इस वर्ग के कुछ निजी सदस्य हैं जो JUCE द्वारा उपयोग किए जाने वाले विशेष ढेर में जगह आवंटित करने के लिए उपयोग किए जाते हैं।

लेकिन यह वही है जो AudioSampleBuffer गायब है (और मैंने इसके बारे में जूल्स से कई चर्चाएं की हैं): एक सदस्य SampleRate। यह कैसे याद किया जा सकता है?

एक ऑडियोसम्प्लबफ़र को पूरा करने के लिए एकल जिम्मेदारी को उस भौतिक ऑडियो का पर्याप्त रूप से प्रतिनिधित्व करना है जो एक सुनता है कि उसके नमूने प्रतिनिधित्व करते हैं। जब आप किसी साउंडफाइल या किसी स्ट्रीम से पढ़ते हुए किसी AudioSampleBuffer को इनपुट करते हैं, तो एक अतिरिक्त पैरामीटर होता है जिसे आपको प्राप्त करना होगा और इसे AudioSampleBuffer के साथ प्रसंस्करण विधियों (इसे एक फ़िल्टर है) के साथ पास करना होगा, जिसे नमूना दर जानने की आवश्यकता है या, अंत में, एक विधि है कि करने के लिए खेलता है बफर बाहर सुना जा (या कोई अन्य किसी ऐसे स्थान के लिए यह धाराओं)। जो कुछ।

लेकिन आपको जो करना है, वह इस नमूनाट्रेड को पारित करना जारी रखता है, जो कि ऑडियोस्प्लायफर बफ़र में रहने वाले विशिष्ट ऑडियो में निहित है, हर जगह। मैंने कोड देखा है जहां एक समारोह में एक निरंतर 44100.0f पास किया गया था, क्योंकि प्रोग्रामर को यह नहीं पता था कि क्या करना है।

यह अपनी एकल जिम्मेदारी को पूरा करने में विफल रहने का एक उदाहरण है।


1

एक ठोस तरीका हो सकता है, जो आपने कहा था उसके आधार पर - कि उच्च सामंजस्य एकल जिम्मेदारी का नेतृत्व करता है आप सामंजस्य को माप सकते हैं। एक मैक्सिमम कोसिव क्लास में सभी तरीकों में इस्तेमाल होने वाले सभी क्षेत्र होते हैं। जबकि एक अधिकतम कोसिसेव वर्ग हमेशा संभव नहीं है और न ही वांछनीय है कि इस तक पहुंचने के लिए अभी भी सबसे अच्छा है। इस वर्ग के डिजाइन लक्ष्य के बाद यह बहुत आसान है कि आपकी कक्षा में कई तरीके या क्षेत्र नहीं हो सकते हैं (कुछ का कहना है कि अधिकतम 7)।

एक और तरीका ओओपी के शुद्ध मूल से है - वास्तविक वस्तुओं के बाद मॉडल। वास्तविक वस्तुओं की जिम्मेदारी को देखने के लिए यह बहुत आसान है। हालांकि, यदि वास्तविक वस्तु बहुत जटिल है, तो इसे कई विपरीत वस्तुओं में विभाजित किया जाता है, जिनमें से प्रत्येक की अपनी जिम्मेदारी है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.