सिंगल रिस्पांसिबिलिटी प्रिंसिपल - मैं कोड फ्रैग्मेंटेशन से कैसे बच सकता हूं?


56

मैं एक टीम पर काम कर रहा हूं, जहां टीम लीडर, SOLID विकास सिद्धांतों का एक बड़ा समर्थक है। हालांकि, दरवाजे के बाहर जटिल सॉफ्टवेयर प्राप्त करने के लिए उनके पास बहुत अधिक अनुभव नहीं है।

हमारे पास एक ऐसी स्थिति है जहां उसने एसआरपी लागू किया है जो पहले से ही काफी जटिल कोड आधार था, जो अब बहुत ही खंडित और समझने और बहस करने में मुश्किल हो गया है।

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

हमारे पास कुछ क्लास कंस्ट्रक्टर हैं जो 20 से अधिक इंटरफ़ेस पैरामीटर लेते हैं, इसलिए हमारा IoC पंजीकरण और रिज़ॉल्यूशन अपने आप में एक राक्षस बन रहा है।

मैं जानना चाहता हूं कि क्या एसआरपी के दृष्टिकोण से दूर कोई 'रिफ्लेक्टर' है जिसका उपयोग हम इन मुद्दों में से कुछ को ठीक करने में कर सकते हैं। मैंने पढ़ा है कि यह SOLID का उल्लंघन नहीं करता है अगर मैं कई खाली मोटे-अनाज वाले वर्गों का निर्माण करता हूं जो उनकी कार्यक्षमता के योग को एक-बिंदु तक पहुंच प्रदान करने के लिए बहुत निकट से संबंधित कक्षाओं की संख्या को लपेटते हैं (यानी कम नकल करते हैं अत्यधिक SRP'd वर्ग कार्यान्वयन)।

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

कोई सुझाव ?


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

6
'कारण बदलने के लिए' के ​​रूप में - समय से पहले सभी कारणों पर अटकलें लगाने की कोई जरूरत नहीं है। तब तक प्रतीक्षा करें जब तक आपको वास्तव में उसे बदलना न पड़े, और फिर देखें कि भविष्य में इस तरह के बदलाव को आसान बनाने के लिए क्या किया जा सकता है।

62
20 कंस्ट्रक्टर मापदंडों के साथ एक वर्ग मेरे लिए बहुत एसआरपी ध्वनि नहीं करता है!
मैटडवे

1
आप "... आईओसी पंजीकरण और संकल्प ..." लिखते हैं; ऐसा लगता है जैसे आप (या आपकी टीम लीड) "आईओसी" और "निर्भरता इंजेक्शन" (डीआई) एक ही चीज है, जो कि सच नहीं है। DI आईओसी प्राप्त करने का एक साधन है, लेकिन निश्चित रूप से केवल एक ही नहीं है। आपको ध्यान से विश्लेषण करना चाहिए कि आप आईओसी क्यों करना चाहते हैं; यदि यह इसलिए है क्योंकि आप इकाई परीक्षण लिखना चाहते हैं, तो आप सेवा लोकेटर पैटर्न या बस इंटरफ़ेस वर्गों ( ISomething) का उपयोग करने का भी प्रयास कर सकते हैं । IMHO, ये अनुमोदन निर्भरता इंजेक्शन की तुलना में अधिक आसान होते हैं और अधिक पठनीय कोड के परिणामस्वरूप होते हैं।

2
यहाँ दिया गया कोई भी उत्तर शून्य में होगा; हमें विशिष्ट प्रतिक्रिया देने के लिए कोड देखना होगा। एक कंस्ट्रक्टर में 20 पैरामीटर? ठीक है, आपको एक वस्तु याद आ रही है ... या वे सभी मान्य हो सकती हैं; या वे एक config फाइल में हो सकते हैं, या वे DI श्रेणी से संबंधित हो सकते हैं, या ... लक्षण निश्चित रूप से संदिग्ध लग रहे हैं, लेकिन CS की अधिकांश बातें, "यह निर्भर करता है" ...
स्टीवन ए। लोव

जवाबों:


84

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

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

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

संपादित करें

लोगों को इस तरह से मॉड्यूल डिजाइन करने के लिए प्राप्त करें जो उपयोग में आसानी को प्रोत्साहित करता है। मिनी एपीआई के रूप में प्रत्येक वर्ग के बारे में सोचो। पहले सोचें, "मैं इस वर्ग का उपयोग कैसे करना चाहूंगा," और फिर इसे लागू करें। बस यह मत सोचो कि "इस वर्ग को क्या करने की आवश्यकता है?" यदि आप प्रयोज्य में बहुत अधिक विचार नहीं रखते हैं, तो एसआरपी में कक्षाओं को उपयोग करने के लिए कठिन बनाने की एक महान प्रवृत्ति होती है ।

EDIT 2

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

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

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


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

18
मुझे पता है कि फ्लेमेथ्रोवर क्या है, लेकिन आप एक पोल के साथ मछली कैसे लेते हैं?
आर। मार्टिनो फर्नांडिस

13
+1 SOLID एक अंत का साधन है, अपने आप में एक अंत नहीं है।
बी सेवन

1
+1: मैंने तर्क दिया है कि "द लॉ ऑफ डेमेटर" जैसी चीजें गलत हैं, यह "डेमेटर की गाइड लाइन" होनी चाहिए। इन चीजों को आपके लिए काम करना चाहिए, आपको उनके लिए काम नहीं करना चाहिए।
बाइनरी वॉरियर

2
@EmmadKareem: यह सच है कि DAO वस्तुओं में कई गुण होने चाहिए। लेकिन फिर, कई चीजें हैं जो आप एक Customerवर्ग के रूप में सरल रूप में कुछ में एक साथ समूहित कर सकते हैं और अधिक बनाए रखने योग्य कोड हैं। : यहाँ उदाहरण देखें codemonkeyism.com/...
Spoike

32

मुझे लगता है कि यह मार्टिन फाउलर की रिफ्लेक्टरिंग में है कि मैंने एक बार एसआरपी को एक काउंटर-नियम पढ़ा, जिसे परिभाषित करते हुए कहा कि यह बहुत दूर जा रहा है। एक दूसरा सवाल है, जितना महत्वपूर्ण है "क्या हर वर्ग को बदलने का केवल एक कारण है?" और वह यह है कि "क्या हर परिवर्तन केवल एक वर्ग को प्रभावित करता है?"

यदि पहले प्रश्न का उत्तर, हर मामले में, "हाँ" है, लेकिन दूसरा प्रश्न "पास भी नहीं है," तो आपको फिर से यह देखने की आवश्यकता है कि आप एसआरपी को कैसे लागू कर रहे हैं।

उदाहरण के लिए, यदि एक तालिका में एक फ़ील्ड जोड़ने का मतलब है कि आपको एक डीटीओ और एक सत्यापनकर्ता वर्ग और एक दृढ़ता वर्ग और एक दृश्य मॉडल ऑब्जेक्ट को बदलना होगा और इसी तरह आपने एक समस्या बनाई है। हो सकता है कि आपने SRP को लागू करने के तरीके पर पुनर्विचार किया हो।

शायद आपने कहा है कि एक फ़ील्ड जोड़ना ग्राहक ऑब्जेक्ट को बदलने का कारण है, लेकिन दृढ़ता की परत को बदलना (XML फ़ाइल से डेटाबेस में कहना) ग्राहक ऑब्जेक्ट को बदलने का एक और कारण है। इसलिए आप एक CustomerPersistence ऑब्जेक्ट बनाने का निर्णय लेते हैं। लेकिन अगर आप ऐसा करते हैं कि एक फ़ील्ड जोड़ने से पहले ग्राहकपरिषद वस्तु में बदलाव की आवश्यकता होती है, तो बिंदु क्या था? आपको अभी भी दो कारणों से एक वस्तु मिल गई है - यह अभी ग्राहक नहीं है।

हालाँकि, यदि आप ORM पेश करते हैं, तो यह बहुत संभव है कि आप कक्षाओं को ऐसे बना सकें कि यदि आप DTO में कोई फ़ील्ड जोड़ते हैं, तो यह स्वचालित रूप से उस डेटा को पढ़ने के लिए उपयोग किए गए SQL को बदल देगा। फिर आपको दो चिंताओं को अलग करने का अच्छा कारण मिला है।

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


+1 के लिए "क्या प्रत्येक परिवर्तन केवल एक वर्ग को प्रभावित करता है?"
dj18

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

1
यदि इसके बजाय उन कार्यों को एक आइकिलन इंटरफ़ेस में जोड़ा गया था, जो कि एक किल्न ऑब्जेक्ट द्वारा कार्यान्वित किया गया था, तो तापमानफ़ीडबैकसिस्टम को केवल एक आइकिलन संदर्भ रखने की आवश्यकता होगी। यदि एक स्वतंत्र aftermarket तापमान संवेदक के साथ एक भट्ठा का उपयोग करना आवश्यक था, तो कोई एक कंपोजिटकेन ऑब्जेक्ट का उपयोग कर सकता है, जिसके निर्माता ने एक IHeaterControl और ITENSSensor को स्वीकार किया और उन्हें आइकिलन को लागू करने के लिए उपयोग किया, लेकिन इस तरह के जानबूझकर ढीली रचना कोड में आसानी से पहचानी जा सकेगी।
सुपरकैट

23

सिर्फ इसलिए कि एक प्रणाली जटिल है इसका मतलब यह नहीं है कि आपको इसे जटिल बनाना होगा । यदि आपके पास एक वर्ग है जिसमें बहुत अधिक निर्भरता (या सहयोगी) हैं जैसे:

public class MyAwesomeClass {
    public class MyAwesomeClass(IDependency1 _d1, IDependency2 _d2, ... , IDependency20 _d20) {
      // Assign it all
    }
}

... तो यह रास्ता बहुत जटिल हो गया और आप वास्तव में एसआरपी का पालन ​​नहीं कर रहे हैं, क्या आप? मैं शर्त लगा सकता हूं कि अगर आपने लिखा है कि MyAwesomeClassएक सीआरसी कार्ड पर क्या होता है तो यह एक इंडेक्स कार्ड पर फिट नहीं होगा या आपको वास्तव में छोटे गैरकानूनी पत्रों में लिखना होगा।

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

टीडीडी आपको एक अच्छा संकेतक प्रदान करेगा कि एक वर्ग कितना करता है। कुंद डालना; अगर एक परीक्षण विधि में सेटअप कोड होता है जो लिखने के लिए हमेशा के लिए लेता है (भले ही आप परीक्षणों को फिर से तैयार करते हैं) तो आपके पास MyAwesomeClassशायद बहुत अधिक चीजें हैं।

तो कैसे आप इस पहेली को हल करते हैं? आप अन्य वर्गों के लिए जिम्मेदारियों को आगे बढ़ाते हैं। कुछ ऐसे कदम हैं जिन्हें आप एक वर्ग पर उठा सकते हैं जिसमें यह समस्या है:

  1. उन सभी कार्यों (या जिम्मेदारियों) को पहचानें जो आपकी कक्षा निर्भरता के साथ करती है।
  2. कार्यों को बारीकी से संबंधित निर्भरता के अनुसार समूहित करें।
  3. Redelegate! यानी पहचाने गए कार्यों में से प्रत्येक को नए या (अधिक महत्वपूर्ण रूप से) अन्य वर्गों के लिए रिफ्लेक्टर करें।

जिम्मेदारियों का निर्वाह करने पर एक सार उदाहरण

चलो Cएक वर्ग कई निर्भरता है कि हो सकता है D1, D2, D3, D4है कि आपको कम उपयोग करने के लिए refactor करने के लिए की जरूरत है। जब हम पहचानते हैं कि Cनिर्भरता पर कॉल करने वाले कौन से तरीके हैं, तो हम इसकी एक सरल सूची बना सकते हैं:

  • D1- performA(D2),performB()
  • D2 - performD(D1)
  • D3 - performE()
  • D4 - performF(D3)

सूची को देखते हुए हम यह देख सकते हैं D1और D2एक दूसरे से संबंधित हैं क्योंकि कक्षा को उन्हें किसी भी तरह एक साथ की आवश्यकता है। हम यह भी देख सकते हैं कि D4जरूरत है D3। इसलिए हमारे पास दो समूह हैं:

  • Group 1- D1<->D2
  • Group 2- D4->D3

समूह एक संकेतक हैं कि कक्षा में अब दो जिम्मेदारियां हैं।

  1. Group 1- कॉलिंग दो ऑब्जेक्ट्स को संभालने के लिए एक जो एक दूसरे की आवश्यकता होती है। हो सकता है कि आप अपनी कक्षा Cको दोनों निर्भरता से निपटने की आवश्यकता को समाप्त करने दें और उनमें से एक को कॉल करने के बजाय छोड़ दें। इस समूहीकरण में, यह स्पष्ट है कि D1इसका संदर्भ हो सकता है D2
  2. Group 2- दूसरी जिम्मेदारी के लिए दूसरे को बुलाने के लिए एक वस्तु की जरूरत होती है। अपनी कक्षा के बजाय D4संभाल नहीं सकते D3? तब हम शायद समाप्त कर सकते हैं D3वर्ग से Cअनुमति देकर D4बजाय कॉल करते हैं।

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


संपादित करें:

टिप्पणियों के बीच @ ईमद करीम कहते हैं:

"अगर आपकी कक्षा में कंस्ट्रक्टर में 20 पैरामीटर हैं, तो यह आपकी टीम की तरह आवाज़ नहीं करता है, यह जानता है कि एसआरपी क्या है। यदि आपके पास एक वर्ग है जो केवल एक चीज करता है, तो इसके 20 निर्भरताएं कैसे हैं?" - मुझे लगता है कि यदि आप एक ग्राहक वर्ग है, निर्माणकर्ता में 20 पैरामीटर होना कोई अजीब बात नहीं है।

यह सच है कि DAO ऑब्जेक्ट में बहुत सारे पैरामीटर होते हैं, जिन्हें आपको अपने कंस्ट्रक्टर में सेट करना होता है, और पैरामीटर आमतौर पर स्ट्रिंग जैसे सरल प्रकार होते हैं। हालाँकि Customer, एक वर्ग के उदाहरण में , आप अभी भी चीजों को सरल बनाने के लिए अन्य वर्गों के अंदर गुण कर सकते हैं। जैसे कि Addressसड़कों के साथ एक Zipcodeवर्ग और एक वर्ग जिसमें ज़िपकोड होता है और व्यावसायिक तर्क जैसे डेटा सत्यापन के रूप में अच्छी तरह से काम करेगा:

public class Address {
    private String street1;
    //...

    private Zipcode zipcode;

    // easy to extend
    public bool isValid() {
        return zipcode.isValid();
    }
}

public class Zipcode {
    private string zipcode;
    public bool isValid() {
        // return regex match that zipcode contains numbers
    }
}

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


+1: शानदार जवाब! समूहीकरण IMO एक बहुत ही शक्तिशाली तंत्र है क्योंकि आप सामूहिक रूप से पुनरावर्ती आवेदन कर सकते हैं। बहुत मोटे तौर पर बोलते हुए, n अमूर्त परतों के साथ आप 2 ^ n आइटम व्यवस्थित कर सकते हैं।
जियोर्जियो

+1: आपके पहले कुछ पैराग्राफ ठीक वही हैं जो मेरी टीम का सामना कर रहे हैं। "बिजनेस ऑब्जेक्ट्स" जो वास्तव में सेवा ऑब्जेक्ट हैं, और यूनिट टेस्ट सेटअप कोड है जो लिखने के लिए दिमाग सुन्न है। मुझे पता था कि हमारे पास एक समस्या थी जब हमारी सर्विस लेयर कॉल में कोड की एक पंक्ति होगी; एक व्यापार परत विधि के लिए एक कॉल।
मैन

3

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

जब लिगेसी सिस्टम के साथ काम करने के लिए "उत्साह" सब कुछ ठीक करने के लिए आमतौर पर टीम लीड्स में काफी अधिक होता है, खासकर उन लोगों के लिए जो उस भूमिका के लिए नए हैं। ठोस, बस एसआरपी नहीं है - यह सिर्फ एस है। सुनिश्चित करें कि यदि आप एसओएलआईडी का पालन कर रहे हैं, तो आप ओएलआईडी को भी नहीं भूलेंगे।

मैं अभी एक लिगेसी प्रणाली पर काम कर रहा हूं और हमने शुरुआत में एक समान रास्ते पर जाना शुरू किया। क्या हमारे लिए काम किया एक था सामूहिक टीम निर्णय दोनों दुनिया का सबसे अच्छा बनाने के लिए - ठोस और KISS (यह सरल बेवकूफ रखें)। हमने सामूहिक रूप से कोड संरचना में बड़े बदलावों पर चर्चा की और विभिन्न विकास सिद्धांतों को लागू करने में सामान्य ज्ञान लागू किया। वे दिशानिर्देश "एस / डब्ल्यू विकास के कानून" के रूप में महान हैं। टीम टीम लीड के बारे में नहीं है - टीम के सभी डेवलपर्स के बारे में। मेरे लिए हमेशा काम करने वाली बात यह है कि हर किसी को एक कमरे में ले जाना चाहिए और दिशानिर्देशों के एक साझा सेट के साथ आना है, जिसे आपकी पूरी टीम पालन करने के लिए सहमत है।

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


3

इसका उत्तर सभी के ऊपर कोड की स्थिरता और स्पष्टता है। मेरे लिए इसका मतलब है कि कम कोड लिखना , अधिक नहीं। कम अमूर्तता, कम इंटरफेस, कम विकल्प, कम पैरामीटर।

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

SRP के शीर्ष पर, कई अन्य विकास शैलियाँ हैं। आपके मामले में YAGNI की तरह इसकी आवाज़ निश्चित रूप से कमी है।


3

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

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

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

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

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

यदि आप दोनों स्वीकार कर सकते हैं कि एसआरपी एक अच्छी बात है, कि आप सिर्फ पहलुओं की अलग-अलग व्याख्या करते हैं, तो आप शायद उत्पादक बातचीत शुरू कर सकते हैं।


-1

मैं आपकी टीम के नेतृत्व के फैसले [अपडेट = 2012.05.31] से सहमत हूं कि एसआरपी आमतौर पर एक अच्छा विचार है। लेकिन मैं पूरी तरह से @ Spoike -s टिप्पणी से सहमत हूँ कि 20 इंटरफ़ेस तर्क के साथ एक निर्माता बहुत दूर है। [/ अद्यतन]:

आईओसी के साथ एसआरपी का परिचय एक "बहु-जिम्मेदार-वर्ग" से कई एसआरपी -कक्षाओं के लिए जटिल होता है और लाभ के लिए बहुत अधिक जटिल आरंभ होता है

  • आसान इकाई-परीक्षण / टीडीडी (एक समय में अलगाव में एक एसआरपी-क्लास का परीक्षण)
  • लेकिन की कीमत पर
    • एक बहुत अधिक विभेदक कोड आरंभीकरण और एकीकरण और
    • अधिक विसरित डिबगिंग
    • विखंडन (= कई फाइलों / निर्देशिकाओं पर कोड का वितरण)

मुझे डर है कि आप srp को पवित्र किए बिना कोडफ्रैग्मेंटेशन को कम नहीं कर सकते।

लेकिन आप एक सिंथैटिक शुगर क्लास को लागू करके कोडिनेशन के "दर्द को कम कर सकते हैं" जो एक कंस्ट्रक्टर में इनिशियलाइज़ेशन की जटिलता को छुपाता है।

   class MySrpClass {
      MySrpClass(Interface1 parm1, Interface2 param2, .... Interface20 param2) {
      }
   } 

   class MySyntaxSugarClass : MySrpClass {
      MySyntaxSugarClass() {
         super(new MyInterface1Implementation(), new MyImpl2(), ....)
      }
   }

2
मेरा मानना ​​है कि 20 इंटरफेस एक संकेतक है जो कक्षा में बहुत अधिक है। यानी इसके बदलने के 20 कारण हैं, जो एसआरपी का उल्लंघन है। सिर्फ इसलिए कि प्रणाली जटिल है इसका मतलब यह नहीं है कि इसे जटिल होना है।
स्पिकाइ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.