एकल जिम्मेदारी सिद्धांत को तोड़े बिना एक वर्ग के पास कई तरीके कैसे हो सकते हैं


64

एकल जिम्मेदारी के सिद्धांत पर परिभाषित किया गया है विकिपीडिया के रूप में

एकल जिम्मेदारी सिद्धांत एक कंप्यूटर प्रोग्रामिंग सिद्धांत है जो बताता है कि प्रत्येक मॉड्यूल, वर्ग या फ़ंक्शन को सॉफ्टवेयर द्वारा प्रदान की गई कार्यक्षमता के एक हिस्से पर जिम्मेदारी होनी चाहिए, और यह जिम्मेदारी पूरी तरह से कक्षा द्वारा पूरी की जानी चाहिए।

यदि एक वर्ग के पास केवल एक ही जिम्मेदारी होनी चाहिए, तो उसके पास 1 से अधिक तरीका कैसे हो सकता है? क्या प्रत्येक विधि की एक अलग जिम्मेदारी नहीं होगी, जिसका अर्थ यह होगा कि कक्षा में 1 से अधिक जिम्मेदारी होगी।

प्रत्येक उदाहरण मैंने देखा है कि एकल जिम्मेदारी सिद्धांत का प्रदर्शन एक उदाहरण वर्ग का उपयोग करता है जिसमें केवल एक विधि होती है। यह एक उदाहरण को देखने में मदद कर सकता है या कई तरीकों के साथ एक वर्ग की व्याख्या कर सकता है जिसे अभी भी एक जिम्मेदारी माना जा सकता है।


11
एक गिरावट क्यों? एसईई के लिए एक आदर्श प्रश्न की तरह लगता है; व्यक्ति ने विषय पर शोध किया, और प्रयास को प्रश्न को बहुत स्पष्ट बना दिया। यह इसके बजाय उत्थान के योग्य है।
आर्सेनी मूरज़ेंको

19
डाउनवोट शायद इस वजह से एक सवाल था, जिसे पहले ही कई बार पूछा और जवाब दिया जा चुका है, उदाहरण के लिए सॉफ्टवेयरइंजीनियरिंग.स्टैकएक्सचेंज . com/questions/345018/… देखें । मेरी राय में, यह पर्याप्त नए पहलुओं को नहीं जोड़ता है।
हंस-मार्टिन मोजर


9
यह केवल reductio ad absurdum है। यदि हर वर्ग को शाब्दिक रूप से केवल एक ही विधि की अनुमति थी, तो इसका शाब्दिक अर्थ है कि कोई भी कार्यक्रम कभी भी एक से अधिक कार्य करने में सक्षम नहीं होगा।
डारेल हॉफमैन

6
@DarrelHoffman यह सच नहीं है। यदि हर वर्ग केवल "कॉल ()" विधि के साथ एक फ़नकार था, तो आपने मूल रूप से ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग के साथ सादे प्रक्रियात्मक प्रोग्रामिंग का अनुकरण किया है। आप अभी भी कुछ भी कर सकते हैं जो आप अन्यथा कर सकते थे, क्योंकि एक क्लास "कॉल ()" विधि कई अन्य वर्गों के "कॉल ()" तरीकों को कॉल कर सकती है।
Vaelus

जवाबों:


29

एकल जिम्मेदारी कुछ ऐसी नहीं हो सकती है जो एक एकल फ़ंक्शन पूरा कर सकती है।

 class Location { 
     public int getX() { 
         return x;
     } 
     public int getY() { 
         return y; 
     } 
 }

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

यदि SRP का पालन किया गया है तो यह स्पष्ट होगा कि स्थान वर्ग श्री X और उसके समूह की चीजों के लिए योगदान देता है या नहीं। स्पष्ट करें कि कक्षा किसके लिए जिम्मेदार है और आप जानते हैं कि इस वर्ग पर कौन सा निर्देश प्रभाव डालता है। यदि वे दोनों इस वर्ग को प्रभावित करते हैं तो इसे खराब रूप से परिवर्तन के प्रभाव को कम करने के लिए डिज़ाइन किया गया था। "एक वर्ग को बदलने का केवल एक कारण होना चाहिए" इसका मतलब यह नहीं है कि पूरी कक्षा केवल एक छोटी सी चीज ही कर सकती है। इसका मतलब है कि मुझे कक्षा को देखने में सक्षम नहीं होना चाहिए और कहना चाहिए कि श्री एक्स और श्रीमती वाई दोनों को इस वर्ग में रुचि है।

इसके अलावा अन्य चीजें। नहीं, कई तरीके ठीक हैं। बस इसे एक नाम दें जो स्पष्ट करता है कि कक्षा में क्या विधियां हैं और क्या नहीं हैं।

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

"एक मॉड्यूल को एक, और केवल एक, अभिनेता के लिए जिम्मेदार होना चाहिए"

रॉबर्ट सी मार्टिन - स्वच्छ वास्तुकला

लोग दायरे को सीमित करने के लिए हर कारण के बारे में एसआरपी चाहते हैं। एसआरपी की तुलना में दायरा सीमित करने के और भी कारण हैं। मैं आगे के दायरे को सीमित करके कक्षा को एक एब्स्ट्रैक्शन बना सकता हूं जो एक ऐसा नाम ले सकता है जो यह सुनिश्चित करता है कि अंदर देखना आपको आश्चर्यचकित नहीं करेगा

आप कर्ली के नियम को कक्षाओं में लागू कर सकते हैं। आप बाहर हैं कि अंकल बॉब किस बारे में बात करते हैं लेकिन आप कर सकते हैं। जब आप गलत होते हैं, जब आप सोचना शुरू करते हैं कि एक फ़ंक्शन का मतलब है। यह सोचने जैसा है कि परिवार में केवल एक बच्चा होना चाहिए। एक से अधिक बच्चे होने से यह परिवार होने से नहीं रोकता है।

यदि आप एक कक्षा में घुंघराले नियम लागू करते हैं, तो कक्षा में सब कुछ एक एकल विचार के बारे में होना चाहिए। वह विचार व्यापक हो सकता है। विचार हठ हो सकता है। यदि कुछ लॉगिंग यूटिलिटी फ़ंक्शन हैं, तो वे स्पष्ट रूप से जगह से बाहर हैं। इससे कोई फर्क नहीं पड़ता कि श्री एक्स ही एकमात्र है जो इस कोड के बारे में परवाह करता है।

यहां लागू करने के लिए क्लासिक सिद्धांत को सेपरेशन ऑफ कंसर्न कहा जाता है । यदि आप अपनी सभी चिंताओं को अलग करते हैं तो यह तर्क दिया जा सकता है कि किसी एक जगह पर जो बचा है वह एक चिंता है। 1991 की फिल्म सिटी स्लीकर्स ने हमें घुंघराले चरित्र से परिचित कराया, इससे पहले हमने इस विचार को कहा।

यह ठीक है। यह सिर्फ इतना है कि चाचा बॉब एक ​​जिम्मेदारी को क्या कहते हैं चिंता का विषय नहीं है। उस पर एक जिम्मेदारी कुछ आप पर ध्यान केंद्रित नहीं है। यह कुछ ऐसा है जो आपको बदलने के लिए मजबूर कर सकता है। आप एक चिंता पर ध्यान केंद्रित कर सकते हैं और फिर भी कोड बना सकते हैं जो विभिन्न एजेंडा वाले लोगों के विभिन्न समूहों के लिए जिम्मेदार है।

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

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

कार्यात्मक तरीका यह को देखने के लिए कि है a.f(x)और a.g(x)च बस रहे हैं एक (x) और जी एक (एक्स)। दो फ़ंक्शंस नहीं बल्कि एक साथ होने वाले फ़ंक्शंस की जोड़ियों का सिलसिला। इसमें aडेटा होना भी नहीं चाहिए। यह केवल यह हो सकता है कि आप कैसे जानते हैं कि आप किस कार्यान्वयन fऔर gकार्यान्वयन का उपयोग करने जा रहे हैं। एक साथ बदलने वाले कार्य एक साथ होते हैं। यह अच्छा पुराना बहुरूपता है।

दायरा सीमित करने के कई कारणों में एसआरपी सिर्फ एक कारण है। यह बेहतर है। लेकिन केवल एक ही नहीं।


25
मुझे लगता है कि यह जवाब किसी को SRP का पता लगाने के लिए भ्रमित कर रहा है। श्री राष्ट्रपति और श्रीमती निदेशक के बीच की लड़ाई तकनीकी माध्यम से हल नहीं हुई है और इसका उपयोग इंजीनियरिंग निर्णय को सही ठहराने के लिए किया गया है। कॉनवे का कानून कार्रवाई में।
whatsisname

8
@whatsisname इसके विपरीत। SRP का मतलब स्पष्ट रूप से हितधारकों पर लागू होना था। इसका तकनीकी डिजाइन से कोई लेना- देना नहीं है। आप उस दृष्टिकोण से असहमत हो सकते हैं, लेकिन यह है कि एसआरपी को मूल रूप से अंकल बॉब द्वारा कैसे परिभाषित किया गया है, और उन्हें इसे बार-बार दोहराना पड़ा क्योंकि किसी कारण से, लोग इस सरल धारणा (मन, चाहे) को समझने में सक्षम नहीं लगते हैं यह वास्तव में उपयोगी है एक पूरी तरह से रूढ़िवादी सवाल है)।
लुआण

टिम ओटिंगर द्वारा वर्णित कर्ली लॉ, इस बात पर जोर देता है कि एक चर का लगातार एक ही मतलब होना चाहिए । मेरे लिए, एसआरपी उससे थोड़ा मजबूत है; एक वर्ग वैचारिक रूप से "एक चीज" का प्रतिनिधित्व कर सकता है, फिर भी एसआरपी का उल्लंघन कर सकता है यदि परिवर्तन के दो बाहरी ड्राइवर अलग-अलग तरीकों से उस "एक चीज" के कुछ पहलू का इलाज करते हैं, या दो अलग-अलग पहलुओं के बारे में चिंतित हैं। समस्या मॉडलिंग में से एक है; आपने एक एकल वर्ग के रूप में कुछ मॉडल बनाने के लिए चुना है, लेकिन डोमेन के बारे में कुछ ऐसा है जो उस विकल्प को समस्याग्रस्त बनाता है (कोडबेस के विकसित होते ही चीजें आपके रास्ते में आने लगती हैं)।
फिलिप मिलोवानोविक

2
@ FilipMilovanović कॉनवे के नियम और एसआरपी के बीच समानता मैं देख रहा हूं जिस तरह से अंकल बॉब ने एसआरपी को अपने क्लीन आर्किटेक्चर किताब में समझाया कि इस धारणा से आता है कि संगठन के पास एक स्वच्छ चक्रीय ऑर्ग चार्ट है। यह एक पुराना विचार है। यहाँ तक कि बाइबिल में एक उद्धरण है: "कोई भी व्यक्ति दो स्वामी की सेवा नहीं कर सकता है"।
कैंडिड_ओरेंज

1
@TKK ने इसे संबंधित किया (इसे बराबर नहीं करते हुए) कॉनवे के नियम से नहीं, क्यूरी का नियम। मैं इस विचार का खंडन कर रहा हूं कि एसआरपी घुंघराले नियम है, क्योंकि अंकल बॉब ने अपनी स्वच्छ वास्तुकला पुस्तक में खुद ऐसा कहा है।
candied_orange

48

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

यहाँ एक उदाहरण है। कल्पना कीजिए कि आपको एक सीक्वेंस से सीएसवी बनाने की जरूरत है। यदि आप RFC 4180 के अनुरूप होना चाहते हैं, तो एल्गोरिथ्म को लागू करने और सभी किनारे के मामलों को संभालने में कुछ समय लगेगा।

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

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

अब, उन सभी विधियों में एक लक्ष्य समान है, वह है, एक क्रम लेना, और CSV उत्पन्न करना। यह वर्ग की एकल जिम्मेदारी है ।


पाब्लो एच ने टिप्पणी की:

अच्छा उदाहरण है, लेकिन मुझे लगता है कि यह अभी भी जवाब नहीं देता है कि एसआरपी एक वर्ग को एक से अधिक सार्वजनिक पद्धति की अनुमति क्यों देता है।

वास्तव में। मैंने जो CSV उदाहरण दिया है वह आदर्श रूप से एक सार्वजनिक विधि है और अन्य सभी विधियाँ निजी हैं। एक बेहतर उदाहरण एक कतार का होगा, जिसे एक Queueवर्ग द्वारा लागू किया जाएगा । इस वर्ग में मूल रूप से, दो विधियाँ होंगी: push(भी कहा जाता है enqueue), और pop(भी कहा जाता है dequeue)।

  • Queue.pushकतार की पूंछ में किसी वस्तु को जोड़ने की जिम्मेदारी है।

  • जिम्मेदारी Queue.popयह है कि कतार के सिर से एक वस्तु को हटा दें, और उस मामले को संभालें जहां कतार खाली है।

  • Queueवर्ग की जिम्मेदारी एक कतार तर्क प्रदान करना है।


1
अच्छा उदाहरण है, लेकिन मुझे लगता है कि यह अभी भी जवाब नहीं देता है कि एसआरपी एक वर्ग को एक से अधिक सार्वजनिक पद्धति की अनुमति क्यों देता है ।
पाब्लो एच

1
@ पाब्लो ह: मेला। मैंने एक और उदाहरण जोड़ा जिसमें एक वर्ग के दो तरीके हैं।
आर्सेनी मूरज़ेंको

30

एक फ़ंक्शन एक फ़ंक्शन है।

एक जिम्मेदारी एक जिम्मेदारी है।

एक मैकेनिक के पास कारों को ठीक करने की जिम्मेदारी है, जिसमें निदान, कुछ सरल रखरखाव कार्य, कुछ वास्तविक मरम्मत कार्य, दूसरों को कार्यों का कुछ प्रतिनिधिमंडल आदि शामिल होंगे।

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

एक एकल जिम्मेदारी का मतलब यह नहीं है कि बहुत कम कोड / कार्यक्षमता है, इसका मतलब यह है कि जो भी कार्यक्षमता है वह उसी जिम्मेदारी के तहत "एक साथ" है।


2
सहमत होना। @ औलीस रोंकेनैन - दो उत्तरों में बाँधने के लिए। और नेस्टेड जिम्मेदारियों के लिए, अपने मैकेनिक सादृश्य का उपयोग करते हुए, एक गैरेज में वाहनों के रखरखाव की जिम्मेदारी है। गैरेज में अलग-अलग यांत्रिकी में कार के विभिन्न हिस्सों की जिम्मेदारी होती है, लेकिन इनमें से प्रत्येक यांत्रिकी एक साथ मिलकर काम करती है
wolfsshield

2
@wolfsshield, सहमत। मैकेनिक जो केवल एक काम करता है वह बेकार है, लेकिन मैकेनिक जिसकी एक भी जिम्मेदारी है (कम से कम जरूरी नहीं है)। यद्यपि वास्तविक जीवन की उपमाएँ अमूर्त ओओपी अवधारणाओं का वर्णन करने के लिए हमेशा सर्वश्रेष्ठ नहीं होती हैं, लेकिन इन अंतरों को अलग करना महत्वपूर्ण है। मेरा मानना ​​है कि अंतर को न समझना पहली बात में भ्रम पैदा करता है।
औलिस रोंकेनैन

3
@AulisRonkainen जब यह दिखता है, बदबू आती है, और एक सादृश्य की तरह महसूस करता है, तो मैंने SRP में जिम्मेदारी शब्द के विशिष्ट अर्थ को उजागर करने के लिए मैकेनिक का उपयोग करने का इरादा किया । मैं आपके उत्तर से पूरी तरह सहमत हूं।
पीटर

20

एकल जिम्मेदारी जरूरी नहीं है कि यह केवल एक ही काम करता है।

उदाहरण के लिए उपयोगकर्ता सेवा वर्ग लें:

class UserService {
    public User Get(int id) { /* ... */ }
    public User[] List() { /* ... */ }

    public bool Create(User u) { /* ... */ }
    public bool Exists(int id) { /* ... */ }
    public bool Update(User u) { /* ... */ }
}

इस वर्ग के कई तरीके हैं लेकिन यह स्पष्ट है। यह डेटा स्टोर में उपयोगकर्ता रिकॉर्ड तक पहुंच प्रदान करता है। इसकी एकमात्र निर्भरता उपयोगकर्ता मॉडल और डेटा स्टोर हैं। यह पूरी तरह से युग्मित और अत्यधिक सामंजस्यपूर्ण है, जो वास्तव में वही है जो SRP आपको सोचने के लिए प्राप्त करने की कोशिश कर रहा है।

SRP को "इंटरफ़ेस अलगाव सिद्धांत" ( SOLID देखें ) के साथ भ्रमित नहीं होना चाहिए । इंटरफ़ेस पृथक्करण सिद्धांत (ISP) कहता है कि छोटे, हल्के इंटरफेस अधिक सामान्यीकृत इंटरफेस से बेहतर होते हैं। अपने मानक पुस्तकालय में ISP का भारी उपयोग किया जाता है:

// Interface to read bytes from a stream
type Reader interface {
    Read(p []byte) (n int, err error)
}

// Interface to write bytes to a stream
type Writer interface {
    Write(p []byte) (n int, err error)
}

// Interface to convert an object into JSON
type Marshaler interface {
    MarshalJSON() ([]byte, error)
}

एसआरपी और आईएसपी निश्चित रूप से संबंधित हैं, लेकिन एक दूसरे का मतलब नहीं है। ISP इंटरफ़ेस स्तर पर है और SRP वर्ग स्तर पर है। यदि कोई वर्ग कई सरल इंटरफेस को लागू करता है, तो यह अब सिर्फ एक जिम्मेदारी नहीं हो सकती है।

ISP और SRP के बीच के अंतर को इंगित करने के लिए Luaan का धन्यवाद।


3
दरअसल, आप इंटरफ़ेस अलगाव सिद्धांत (SOLID में "I") का वर्णन कर रहे हैं। एसआरपी काफी अलग जानवर है।
6

एक तरफ के रूप में, आप किस कोडिंग सम्मेलन का उपयोग कर रहे हैं? मैं उम्मीद करेंगे वस्तुओं UserService और UserUpperCamelCase जा करने के लिए है, लेकिन तरीकों Create , Existsऔर Updateमैं lowerCamelCase जाता।
KlaymenDK

1
@KlaymenDK आप सही हैं, अपरकेस को गो (अपरकेस = एक्सपोर्ट / पब्लिक, लोअरकेस = प्राइवेट) का उपयोग करने से सिर्फ एक आदत है
जेसी

@ लुअन उस ओर इशारा करने के लिए धन्यवाद, मैं अपना जवाब स्पष्ट करूंगा
जेसी

1
@KlaymenDK बहुत सी भाषाएं PascalCase को विधियों के साथ-साथ कक्षाओं के लिए भी उपयोग करती हैं। उदाहरण के लिए सी #।
ओमेगास्टिक

15

एक रेस्तरां में एक शेफ है। खाना बनाना उसकी एकमात्र जिम्मेदारी है। फिर भी वह स्टेक, आलू, ब्रोकोली, और सौ अन्य चीजें पका सकता है। क्या आप अपने मेनू पर एक शेफ प्रति डिश किराए पर लेंगे? या प्रत्येक डिश के प्रत्येक घटक के लिए एक शेफ? या एक शेफ जो अपनी एकल जिम्मेदारी को पूरा कर सकता है: खाना बनाना?

यदि आप पूछते हैं कि महाराज पेरोल के रूप में अच्छी तरह से करते हैं, तो जब आप SRP का उल्लंघन करते हैं।


4

प्रति-उदाहरण: संग्रहणीय अवस्था।

मान लीजिए कि आपके पास सबसे सरल वर्ग था, जिसका एकमात्र काम स्टोर करना है int

public class State {
    private int i;


    public State(int i) { this.i = i; }
}

यदि आप केवल 1 विधि तक सीमित थे, तो आप या तो ए setState(), या ए हो सकते थे getState(), जब तक कि आप इनकैप्सुलेशन को तोड़कर iसार्वजनिक नहीं करते।

  • एक सेटर बिना एक बेकार है (आप कभी भी जानकारी नहीं पढ़ सकते हैं)
  • एक गेटटर एक सेटर के बिना बेकार है (आप कभी भी जानकारी को म्यूट नहीं कर सकते हैं)।

तो स्पष्ट रूप से, इस एकल जिम्मेदारी के लिए इस वर्ग में कम से कम 2 विधियाँ होना आवश्यक है । QED।


4

आप एकल जिम्मेदारी सिद्धांत की गलत व्याख्या कर रहे हैं।

एकल जिम्मेदारी एकल विधि के बराबर नहीं है। उनका मतलब अलग-अलग चीजों से है। सॉफ्टवेयर डेवलपमेंट में हम सामंजस्य के बारे में बात करते हैं । कार्य (विधियाँ) जिनमें उच्च सामंजस्य "एक साथ" होता है और उन्हें एक ही जिम्मेदारी को निभाते हुए गिना जा सकता है।

यह सिस्टम को डिज़ाइन करने के लिए डेवलपर पर निर्भर है ताकि एकल जिम्मेदारी सिद्धांत पूरा हो। एक इसे अमूर्त तकनीक के रूप में देख सकता है और इसलिए कभी-कभी यह एक राय है। एकल जिम्मेदारी सिद्धांत को लागू करने से कोड को मुख्य रूप से परीक्षण करना और इसकी वास्तुकला और डिजाइन को समझना आसान हो जाता है।


2

यह अक्सर चीजों को देखने और कार्यों के बजाय डेटा के दृष्टिकोण से व्यवस्थित करने के लिए (किसी भी भाषा में, लेकिन विशेष रूप से ओओ भाषाओं में) सहायक होता है।

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

और विशेष रूप से, वर्ग को कुछ भी नहीं उजागर करना चाहिए जिसके परिणामस्वरूप असंगत या गलत डेटा हो सकता है। उदाहरण के लिए, यदि Point(127,127) प्लेन के माध्यम से (0,0) के भीतर झूठ बोलना चाहिए, कंस्ट्रक्टर और नए तरीकों को संशोधित करने या उत्पन्न Pointकरने के लिए उनके द्वारा दिए गए मानों की जाँच करने और इसे बदलने वाले किसी भी परिवर्तन को अस्वीकार करने की जिम्मेदारी है। आवश्यकता। (अक्सर ऐसा कुछ Pointअपरिवर्तनीय होगा, और यह सुनिश्चित करना कि Pointनिर्माण के बाद इसे संशोधित करने के कोई तरीके नहीं हैं, तब भी कक्षा की एक जिम्मेदारी होगी)

ध्यान दें कि यहां लेयरिंग पूरी तरह से स्वीकार्य है। आपके पास Pointअलग-अलग बिंदुओं से निपटने के लिए एक वर्ग हो सकता है और एस के Polygonसेट से निपटने के लिए एक वर्ग हो सकता है Point; इन पर अभी भी अलग-अलग ज़िम्मेदारियाँ हैं क्योंकि Polygonकिसी भी चीज़ से निपटने के लिए सभी ज़िम्मेदारियों को पूरा करता है Point(जैसे कि यह सुनिश्चित करना कि किसी बिंदु का वर्ग के लिए मूल्य xऔर yमूल्य दोनों है ) Point

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