एकल जिम्मेदारी सिद्धांत
("हर वर्ग के पास केवल एक ही जिम्मेदारी होनी चाहिए; दूसरे शब्दों में, हर वर्ग में एक, और केवल एक ही होना चाहिए, बदलने का कारण")
मैं असहमत हूं। मुझे लगता है कि एक विधि को बदलने का केवल एक कारण होना चाहिए, और एक कक्षा के सभी तरीकों का एक-दूसरे से तार्किक संबंध होना चाहिए , लेकिन वर्ग स्वयं वास्तव में ऐसा कर सकता है कई (संबंधित) बातें।
मेरे अनुभव में, इस सिद्धांत को अक्सर अति उत्साह से लागू किया जाता है, और आप कई छोटे एक-विधि वर्गों के साथ समाप्त होते हैं। मैंने जो काम किया है, दोनों फुर्तीली दुकानों ने ऐसा किया है।
कल्पना करें कि .Net API के रचनाकारों की मानसिकता इस प्रकार की हो: List.Sort (), List.Reverse (), List.Find () आदि के बजाय, हमारे पास ListSorter, ListReverser और ListSerer वर्ग होंगे!
एसआरपी के खिलाफ अब और बहस करने के बजाय (जो खुद सिद्धांत में भयानक नहीं है) , मैं अपने लंबे समय से प्रसारित कुछ अनुभव साझा करूंगा:
एक स्थान पर मैंने काम किया, मैंने एक बहुत ही सरल अधिकतम प्रवाह सॉल्वर लिखा, जिसमें पांच वर्ग शामिल थे: एक नोड, एक ग्राफ़, एक क्रिएटर, एक ग्राफ़-सॉल्वर और एक वर्ग जो ग्राफ़-क्रिएटर / सॉल्वर का उपयोग करने के लिए हल करता है वास्तविक दुनिया की समस्या। कोई भी विशेष रूप से जटिल या लंबा नहीं था (सॉल्वर अब तक ~ 150 लाइनों में सबसे लंबा था)। हालांकि, यह तय किया गया था कि कक्षाओं में बहुत अधिक "जिम्मेदारियां" थीं, इसलिए मेरे सहकर्मियों ने कोड को फिर से भरने के बारे में निर्धारित किया। जब वे किए गए थे, तो मेरी 5 कक्षाओं का विस्तार 25 वर्गों में किया गया था, जिनकी कुल पंक्तियाँ ट्रिपल से अधिक थीं, जो कि वे मूल रूप से थीं। कोड का प्रवाह अब स्पष्ट नहीं था, न ही नई इकाई-परीक्षणों का उद्देश्य था; अब मेरे पास एक कठिन समय था कि मैं अपना कोड क्या करूं।
एक ही स्थान पर, लगभग हर वर्ग के पास केवल एक ही तरीका था (इसकी एकमात्र "जिम्मेदारी")। कार्यक्रम के भीतर प्रवाह लगभग असंभव था, और अधिकांश यूनिट-परीक्षणों में परीक्षण शामिल था कि इस वर्ग को दूसरे वर्ग से कोड कहा जाता है , दोनों का उद्देश्य समान रूप से मेरे लिए एक रहस्य था। शाब्दिक रूप से सैकड़ों कक्षाएं थीं जहां केवल दर्जनों (आईएमओ) होने चाहिए थे। प्रत्येक वर्ग ने केवल एक "बात" की , लेकिन "AdminUserCreationAttemptorFactory" जैसे नामकरण सम्मेलनों के साथ भी , कक्षाओं के बीच संबंध बताना मुश्किल था।
एक अन्य स्थान पर (जिसमें कक्षाएं भी थीं, केवल-एक-पद्धति मानसिकता थी), हम एक विधि का अनुकूलन करने की कोशिश कर रहे थे जो एक निश्चित ऑपरेशन के दौरान 95% समय लेता था। बाद में (बल्कि बेवकूफी से) इसे थोड़ा सा अनुकूलित करते हुए, मैंने अपना ध्यान इस ओर आकर्षित किया कि इसे बाजिलियन समय क्यों कहा जा रहा है। इसे एक कक्षा में लूप में बुलाया जा रहा था ... जिसकी विधि को दूसरी कक्षा में एक लूप में बुलाया जा रहा था .. जिसे लूप में भी कहा जा रहा था ..
सभी ने बताया, 13 वर्गों (गंभीरता से) में पांच-स्तर के लूप फैले हुए थे। वास्तव में कोई भी एक वर्ग जो कर रहा था, उसे देखते हुए यह निर्धारित करना असंभव था - आपको एक मानसिक ग्राफ को स्केच करना होगा कि यह किस तरीके से कहा जाता है, और उन तरीकों को क्या कहा जाता है, और इसी तरह। यदि यह सब एक विधि में लुप्त हो गया होता, तो यह हमारी समस्या-पद्धति के साथ लगभग 70 पंक्तियों की लंबी होती, जो पांच-स्पष्ट रूप से लूप के पांच-स्तर के अंदर निहित होती है।
उन 13 वर्गों को एक कक्षा में फिर से शामिल करने का मेरा अनुरोध अस्वीकार कर दिया गया।