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


20

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

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


6
@Frank - यह वास्तव में आम तौर पर इस तरह परिभाषित किया गया है - जैसे देखने en.wikipedia.org/wiki/Single_responsibility_principle
जोरिस Timmermans

1
जिस तरह से आप इसे फिर से तैयार कर रहे हैं वह एसआरपी की परिभाषा को समझने का तरीका नहीं है।
पीटर बी

2
कोड की प्रत्येक पंक्ति में (कम से कम) दो कारणों से बदला जा सकता है: यह बग में योगदान देता है या यह एक नई आवश्यकता के साथ हस्तक्षेप करता है।
बार्ट वैन इनगेन शेनॉ

1
@BartvanIngenSchenau: LOL ;-) यदि आप इसे इस तरह देखते हैं, तो SRP कहीं भी लागू नहीं किया जा सकता है।
डॉक ब्राउन

1
@DocBrown: यदि आप स्रोत कोड को बदलने के साथ एसआरपी को जोड़े नहीं रखते हैं। उदाहरण के लिए, यदि आप एसआरपी की व्याख्या करते हैं कि शब्द का उपयोग किए बिना एक वाक्य में एक वर्ग / कार्य क्या करता है और (और उस प्रतिबंध के आसपास कोई भी शब्द नहीं मिलता है) का पूरा विवरण देने में सक्षम है ।
बार्ट वैन इनगेन शेनॉ

जवाबों:


27

बेशक, YAGNI सिद्धांत आपको बताएगा कि SRP लागू करने से पहले आपको वास्तव में इसकी आवश्यकता नहीं है। लेकिन सवाल आपको खुद से पूछना चाहिए: क्या मुझे पहले एसआरपी लागू करने की आवश्यकता है और केवल तभी जब मुझे अपना कोड बदलना होगा?

मेरे अनुभव से, एसआरपी का आवेदन आपको बहुत पहले एक लाभ देता है: जब आपको यह पता लगाना होगा कि आपके कोड में एक विशिष्ट परिवर्तन कहां और कैसे लागू किया जाए। इस कार्य के लिए, आपको अपने मौजूदा कार्यों और कक्षाओं को पढ़ना और समझना होगा। यह बहुत आसान हो जाता है जब आपके सभी कार्यों और वर्गों की एक विशिष्ट जिम्मेदारी होती है। तो IMHO आपको SRP लागू करना चाहिए जब भी यह आपके कोड को पढ़ना आसान बनाता है, जब भी यह आपके कार्यों को छोटा और अधिक आत्म-वर्णन करता है। तो इसका उत्तर है हां , नए कोड के लिए भी एसआरपी को लागू करना समझदारी है।

उदाहरण के लिए, जब आपका मुद्रण कोड एक दस्तावेज़ पढ़ता है, तो दस्तावेज़ को प्रारूपित करता है और परिणाम को एक विशिष्ट डिवाइस पर प्रिंट करता है, ये 3 स्पष्ट पृथक्करण जिम्मेदारियां हैं। इसलिए उनमें से कम से कम 3 कार्य करें, उन्हें नाम के अनुसार दें। उदाहरण के लिए:

 void RunPrintWorkflow()
 {
     var document = ReadDocument();
     var formattedDocument = FormatDocument(document);
     PrintDocumentToScreen(formattedDocument);
 }

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

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

संपादित करें: आपकी टिप्पणी के लिए: ऊपर के उदाहरण में बाहरी फ़ंक्शन की मुख्य जिम्मेदारी किसी विशिष्ट डिवाइस पर प्रिंट नहीं करना है, या दस्तावेज़ को प्रारूपित करना है - यह मुद्रण वर्कफ़्लो को एकीकृत करना है । इस प्रकार, बाहरी फ़ंक्शन के अमूर्त स्तर पर, "डॉक्स को अब स्वरूपित नहीं किया जाना चाहिए" या "मुद्रित होने के बजाय" डॉक्टर को मेल किया जाना चाहिए "जैसी एक नई आवश्यकता है" बस यही कारण है कि "-" मुद्रण वर्कफ़्लो बदल गया है "। अगर हम इस तरह की चीजों के बारे में बात करते हैं, तो सही स्तर पर अमूर्तता से चिपके रहना महत्वपूर्ण है ।


मैं आमतौर पर हमेशा TDD के साथ विकसित होता हूं इसलिए मेरे उदाहरण में मैं शारीरिक रूप से उस तर्क को एक मॉड्यूल में नहीं रख पा रहा हूं क्योंकि यह परीक्षण करना असंभव होगा। यह सिर्फ टीडीडी का उप-उत्पाद है और इसलिए नहीं कि मैं जानबूझकर एसआरपी लागू कर रहा हूं। मेरा उदाहरण काफी हद तक स्पष्ट, अलग-अलग जिम्मेदारियों का था, शायद एक अच्छा उदाहरण नहीं। मुझे लगता है कि मैं जो पूछ रहा हूं, क्या आप कोड का कोई नया टुकड़ा लिख सकते हैं और असमान रूप से कह सकते हैं, हां यह SRP का उल्लंघन नहीं करता है? व्यवसाय द्वारा अनिवार्य रूप से परिभाषित 'परिवर्तन करने के लिए कारण' नहीं हैं?
SeeNoWeevil

3
@ गुप्तचर: हाँ, आप (कम से कम तत्काल रिफैक्टरिंग द्वारा) कर सकते हैं। लेकिन आपको बहुत, बहुत छोटे कार्य मिलेंगे - और हर प्रोग्रामर को यह पसंद नहीं है। इस उदाहरण को देखें: sites.google.com/site/unclebobconsultingllc/…
Doc Brown

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

1
@thecapsaicinkid: मेरा संपादन देखें। बाहरी फ़ंक्शन का मुख्य दायित्व किसी विशिष्ट डिवाइस पर प्रिंट नहीं करना है, या दस्तावेज़ को प्रारूपित करना है - यह प्रिंटिंग वर्कफ़्लो को एकीकृत करना है। और जब यह वर्कफ़्लो बदलता है, तो यह एक और एकमात्र कारण है कि फ़ंक्शन क्यों बदल जाएगा
डॉक्टर ब्राउन

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

7

मुझे लगता है कि आप SRP को गलत समझ रहे हैं।

परिवर्तन का एकल कारण कोड को बदलने के बारे में नहीं है, बल्कि आपके कोड के बारे में है।


3

मुझे लगता है कि एसआरपी की परिभाषा "बदलने के लिए एक कारण" के रूप में इस कारण से भ्रामक है। इसे बिल्कुल अंकित मूल्य पर लें: सिंगल रिस्पॉन्सिबिलिटी प्रिंसिपल का कहना है कि एक क्लास या फंक्शन की एक ही जिम्मेदारी होनी चाहिए। बदलने का केवल एक कारण होने के साथ शुरू करने के लिए केवल एक ही काम करने का एक दुष्प्रभाव है। ऐसा कोई कारण नहीं है कि आप कम से कम अपने कोड में एकल जिम्मेदारी की दिशा में एक प्रयास नहीं कर सकते, बिना यह जाने कि भविष्य में यह कैसे बदल सकता है।

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

निश्चित रूप से, एसआरपी की बारीकियां हैं जिन्हें आप परियोजना में बाद तक नहीं जान सकते - जो एक ही जिम्मेदारी की तरह लग रहा था वह दो या तीन हो गया। ये ऐसे मामले हैं जहां आपको SRP को लागू करने के लिए रिफलेक्टर करना होगा। लेकिन इसका मतलब यह नहीं है कि एसआरपी को तब तक अवहेलना किया जाना चाहिए जब तक कि आप एक परिवर्तन अनुरोध प्राप्त न करें; वह एसआरपी के उद्देश्य को हरा देता है!

अपने उदाहरण से सीधे बात करने के लिए, अपनी प्रिंट विधि का दस्तावेजीकरण करने पर विचार करें। यदि आप कहेंगे "यह विधि मुद्रण के लिए डेटा को प्रारूपित करती है और इसे प्रिंटर को भेजती है," तो वह है और जो आपको मिलता है: वह एक ज़िम्मेदारी नहीं है, यह दो ज़िम्मेदारियाँ हैं: प्रिंटर को स्वरूपित करना और भेजना। यदि आप इसे पहचानते हैं और उन्हें दो कार्यों / वर्गों में विभाजित करते हैं, तो जब आपके परिवर्तन अनुरोध साथ आते हैं, तो आपके पास प्रत्येक अनुभाग के बदलने का केवल एक ही कारण होगा।


3

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

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

कोड को कम करने के लिए परावर्तक

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

एक बुल्सआई बनाएँ

स्रोत कोड को कम करने और कोड पुन: उपयोग में सुधार करने के लिए एकल उपयोग पैटर्न का इरादा था। यह विशेषज्ञता और विशिष्ट कार्यान्वयन बनाने के लिए था। bullseyeआपके लिए स्रोत कोड में एक प्रकार go to specific tasks। जब मुद्रण में कोई समस्या थी तो आपको पता था कि इसे ठीक करने के लिए कहां जाना है।

सिंगल यूज़ का मतलब एम्बिग्रेटेड फ्रैक्चरिंग नहीं है

हां, आपके पास कोड है जो पहले से ही एक दस्तावेज़ प्रिंट करता है। हां, अब आपको पीडीएफ को प्रिंट करने के लिए कोड को भी बदलना होगा। हां, अब आपको दस्तावेज़ के स्वरूपण को बदलना होगा।

क्या आप सुनिश्चित हैं कि usageकाफी बदल गया है?

यदि रीफैक्टरिंग से सोर्स कोड के सेक्शन सामान्य रूप से सामान्य हो जाते हैं। इस बात के लिए कि मूल इरादा printing stuffअब स्पष्ट नहीं है, तो आपने स्रोत कोड में अस्पष्ट फ्रैक्चरिंग पैदा कर दी है।

क्या नया आदमी जल्दी से यह पता लगा पाएगा?

संगठन को समझने के लिए हमेशा अपने स्रोत कोड को सबसे आसान में बनाए रखें।

एक घड़ीसाज़ मत बनो

बहुत बार मैंने देखा है कि डेवलपर्स ने एक ऐपिस पर रखा है, और छोटे विवरणों पर इस बिंदु पर ध्यान केंद्रित करें कि कोई और टुकड़ों को वापस नहीं डाल सकता है फिर से अलग हो जाना चाहिए।

यहां छवि विवरण दर्ज करें


2

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

चूंकि आप घटक लिखते समय विनिर्देश और पर्यावरण को जानते हैं, आप सिद्धांत को लागू कर सकते हैं।

यदि आप उस कोड के उदाहरण पर विचार करते हैं जो किसी दस्तावेज़ को प्रिंट करता है। आपको यह विचार करना चाहिए कि क्या आप दस्तावेज़ को पीडीएफ में समाप्त किए बिना लेआउट टेम्पलेट को परिभाषित कर सकते हैं। आप कर सकते हैं, इसलिए एसआरपी आपको बता रहा है कि आपको चाहिए।

बेशक YAGNI आपको बता रहा है कि आपको नहीं करना चाहिए। आपको डिज़ाइन सिद्धांतों के बीच संतुलन खोजने की आवश्यकता है।


2

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

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

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

यह कदम एक पेंडुलम स्विंग की तुलना में कम विकसित था। जैसा कि पेंडुलम डेटा में आया था, हम फोरट्रान में निहित उपयोग के मामले को खो चुके थे। जब आपका प्राथमिक फोकस स्क्रीन पर डेटा या आकृतियों को शामिल करता है तो ठीक है। यह पॉवरपॉइंट जैसे कार्यक्रमों के लिए एक शानदार मॉडल है, या कम से कम इसके सरल संचालन के लिए।

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

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

यही कारण है कि मैं Trygve Reenskaug के DCI आर्किटेक्चर के बारे में उत्साहित हूं - जो कि लीन आर्किटेक्चर पुस्तक में वर्णित है। यह अंततः कुछ वास्तविक कद देता है जो "एकल जिम्मेदारी" के लिए एक मनमाना और रहस्यमय पालन करता था - जैसा कि ऊपर दिए गए अधिकांश तर्क में पाया गया है। वह कद मानव मानसिक मॉडल से संबंधित है: अंतिम उपयोगकर्ता पहले और प्रोग्रामर दूसरे। यह व्यापारिक चिंताओं से संबंधित है। और, लगभग घटित होने से, यह परिवर्तन को चुनौती देता है क्योंकि फ्लॉप हमें चुनौती देता है।

एकल-जिम्मेदारी सिद्धांत, जैसा कि हम जानते हैं कि यह या तो एक डायनासोर है जो अपने दिनों के मूल से बचा हुआ है या एक शौक घोड़ा है जिसे हम समझने के विकल्प के रूप में उपयोग करते हैं। आपको महान सॉफ्टवेयर करने के लिए इनमें से कुछ शौक घोड़ों को पीछे छोड़ने की जरूरत है। और इसके लिए बॉक्स से हटकर सोचने की जरूरत है। चीजों को सरल और आसान समझना तभी काम करता है जब समस्या सरल और समझने में आसान हो। मुझे उन समाधानों में बहुत दिलचस्पी नहीं है: वे विशिष्ट नहीं हैं, और यह वह जगह नहीं है जहां चुनौती निहित है।


2
जब आपने जो कुछ लिखा था, उसे पढ़ते हुए, कहीं न कहीं मैं पूरी तरह से खो गया हूं कि आप किस बारे में बात कर रहे हैं। अच्छे उत्तर प्रश्न को जंगल में एक रामबाण के शुरुआती बिंदु के रूप में नहीं मानते हैं, बल्कि सभी लेखन को जोड़ने के लिए एक निश्चित विषय के रूप में हैं।
डोनल फेलो

1
आह, तुम मेरे पुराने प्रबंधकों में से एक की तरह हो। "हम इसे समझना नहीं चाहते: हम इसे सुधारना चाहते हैं!" यहां मुख्य विषयगत मुद्दा सिद्धांत में से एक है: यह "एसआरपी" में "पी" है। शायद मैंने सीधे सवाल का जवाब दिया होता अगर यह सही सवाल होता: यह नहीं था। आप उस प्रश्न को उठा सकते हैं, जिसने कभी प्रश्न किया है।
कोप

वहाँ एक अच्छा जवाब यहाँ दफन है कहीं। मुझे लगता है ...
RubberDuck

0

हां, एकल-जिम्मेदारी-सिद्धांत को नए कोड पर लागू किया जाना चाहिए।

परंतु! एक जिम्मेदारी क्या है?

क्या "प्रिंट एक रिपोर्ट एक जिम्मेदारी है"? जवाब, मेरा मानना ​​है कि "शायद" है।

आइए एसआरपी की परिभाषा का उपयोग करने की कोशिश करें, "परिवर्तन के लिए केवल एक ही कारण"।

मान लीजिए आपके पास एक फ़ंक्शन है जो रिपोर्ट प्रिंट करता है। यदि आपके पास दो बदलाव हैं:

  1. उस फ़ंक्शन को बदल दें क्योंकि आपकी रिपोर्ट में काली पृष्ठभूमि होना आवश्यक है
  2. उस फ़ंक्शन को बदलें क्योंकि आपको पीडीएफ में प्रिंट करने की आवश्यकता है

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

लेकिन अगर आपका दूसरा परिवर्तन होता:

2 बी। उस फ़ंक्शन को बदलें क्योंकि आपकी रिपोर्ट को एक अलग फ़ॉन्ट की आवश्यकता है

मैं कहूंगा कि दोनों परिवर्तन "रिपोर्ट शैली को बदल सकते हैं" और वे एक समारोह में रह सकते हैं।

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


0

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

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

इन चीजों के बारे में एक महान पढ़ा: कोप्लिन द्वारा लीन आर्किटेक्चर


0

"प्रिंट" MVC में "दृश्य" बहुत पसंद है। जो कोई भी वस्तुओं की मूल बातें समझता है वह समझ जाएगा।

यह एक सिस्टम की जिम्मेदारी है। यह एक तंत्र के रूप में कार्यान्वित किया जाता है - एमवीसी - जिसमें एक प्रिंटर (दृश्य), मुद्रित होने वाली चीज़ (मॉड्यूल) और प्रिंटर अनुरोध और विकल्प (नियंत्रक से) शामिल है।

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


0

क्या यह वास्तव में एसआरपी लागू करने के लिए शुरू करने के लिए एक बेहतर विचार नहीं है जब कोड को शुरू करने के लिए अनुरोध करना शुरू हो रहा है?

आदर्श रूप से, आपके पास पहले से ही एक अच्छा विचार होगा कि कोड के विभिन्न भागों की जिम्मेदारियां क्या हैं। अपनी पहली वृत्ति के अनुसार जिम्मेदारियों में विभाजित करें, संभवतः इस बात को ध्यान में रखते हुए कि जो पुस्तकालय आप उपयोग कर रहे हैं, वह करना चाहते हैं (एक कार्य को सौंपना, एक जिम्मेदारी, एक पुस्तकालय के लिए आमतौर पर एक बहुत अच्छी बात है, बशर्ते कि पुस्तकालय वास्तव में कार्य कर सकता है )। फिर, बदलती आवश्यकताओं के अनुसार जिम्मेदारियों की अपनी समझ को परिष्कृत करें। बेहतर है कि आप सिस्टम को शुरू में समझते हैं, आपको जिम्मेदारी के कामों को मौलिक रूप से बदलने की जरूरत है (हालांकि कभी-कभी आपको पता चलता है कि एक जिम्मेदारी उप-जिम्मेदारियों में सबसे अच्छी तरह से विभाजित है)।

ऐसा नहीं है कि आपको इसके बारे में चिंता किए एक लंबा समय बिताना चाहिए। कोड की एक प्रमुख विशेषता यह है कि इसे बाद में बदला जा सकता है, आपको इसे पहली बार पूरी तरह से ठीक करने की आवश्यकता नहीं है। बस यह सीखने में समय के साथ बेहतर होने की कोशिश करें कि किस प्रकार की आकार की जिम्मेदारियाँ हैं ताकि आप भविष्य में कम गलतियाँ कर सकें।

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

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

यदि हम एक साधारण वास्तविक उदाहरण को देखें तो यह और भी स्पष्ट हो सकता है। आइए हम sort()उपयोगिता पद्धति पर विचार करें java.util.Arrays। यह क्या करता है? यह एक सरणी को सॉर्ट करता है, और यह सब ऐसा करता है। यह तत्वों को प्रिंट नहीं करता है, यह सबसे नैतिक रूप से फिट सदस्य नहीं पाता है, यह डिक्सी को सीटी नहीं देता है । यह सिर्फ एक सरणी की तरह है। तुम्हें पता नहीं है कि कैसे या तो। छंटनी उस विधि की एकमात्र जिम्मेदारी है। (वास्तव में, आदिम प्रकार के साथ करने के लिए कुछ बदसूरत तकनीकी कारणों के लिए जावा में कई छंटनी विधियां हैं; आपको हालांकि उस पर कोई ध्यान नहीं देना है, क्योंकि वे सभी समान जिम्मेदारियां हैं।)

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

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