प्रश्न एक झूठी दुविधा प्रस्तुत करता है। YAGNI सिद्धांत का उचित अनुप्रयोग कुछ असंबंधित बात नहीं है। यह अच्छे डिजाइन का एक पहलू है। एसओएलआईडी के प्रत्येक सिद्धांत अच्छे डिजाइन के पहलू हैं। आप हमेशा किसी भी विषय में हर सिद्धांत को पूरी तरह से लागू नहीं कर सकते। वास्तविक दुनिया की समस्याओं ने आपके कोड पर बहुत सारी ताकतें डाल दीं, और उनमें से कुछ ने दिशाओं का विरोध किया। डिजाइन के सिद्धांतों को उन सभी के लिए जिम्मेदार होना चाहिए, लेकिन सिद्धांतों का कोई भी मुट्ठी भर सभी स्थितियों को फिट नहीं कर सकता है।
अब, आइए प्रत्येक सिद्धांत पर इस समझ के साथ नज़र डालें कि जब वे कभी-कभी विभिन्न दिशाओं में खींच सकते हैं, तो वे संघर्ष में निहित किसी भी तरह से नहीं होते हैं।
YAGNI की कल्पना डेवलपर्स को एक विशेष प्रकार के पुन: कार्य से बचने में मदद करने के लिए की गई थी: जो कि गलत चीज़ के निर्माण से आता है। यह हमें गलत या भविष्य में जरूरत के हिसाब से मान्यताओं या भविष्यवाणियों के आधार पर गलत निर्णय लेने से बचने के लिए मार्गदर्शन देकर करता है। सामूहिक अनुभव हमें बताता है कि जब हम ऐसा करते हैं, तो हम आमतौर पर गलत होते हैं। उदाहरण के लिए, YAGNI आपको बताएगा कि पुन: प्रयोज्यता के उद्देश्य के लिए एक इंटरफ़ेस न बनाएं , जब तक कि आप अभी यह नहीं जानते कि आपको कई कार्यान्वयनकर्ताओं की आवश्यकता है। इसी तरह YAGNI कहेंगे कि किसी एप्लिकेशन में एकल फ़ॉर्म को प्रबंधित करने के लिए "ScreenManager" न बनाएं जब तक कि आप अभी यह नहीं जानते कि आप एक से अधिक स्क्रीन रखने जा रहे हैं।
कई लोगों को लगता है कि इसके विपरीत, SOLID पुन: प्रयोज्यता, सामान्यता या अमूर्तता के बारे में नहीं है । SOLID का उद्देश्य है कि आप उस कोड को लिखने में मदद करें जो परिवर्तन के लिए तैयार है , बिना इस बारे में कुछ भी कहे कि वह विशिष्ट परिवर्तन क्या हो सकता है। एसओएलआईडी के पांच सिद्धांत बिल्डिंग कोड के लिए एक रणनीति बनाते हैं जो अत्यधिक सामान्य होने के बिना लचीला है, और भोले होने के बिना सरल है। SOLID कोड का उचित अनुप्रयोग अच्छी तरह से परिभाषित भूमिकाओं और सीमाओं के साथ छोटे, केंद्रित वर्ग का उत्पादन करता है। व्यावहारिक परिणाम यह है कि किसी भी आवश्यक आवश्यकताओं को बदलने के लिए, न्यूनतम संख्या में वर्गों को छूने की आवश्यकता है। और इसी तरह, किसी भी कोड परिवर्तन के लिए, अन्य वर्गों के माध्यम से "तरंग" की एक न्यूनतम राशि होती है।
आपके पास उदाहरण की स्थिति को देखते हुए, देखते हैं कि YAGNI और SOLID को क्या कहना पड़ सकता है। आप इस तथ्य के कारण एक सामान्य रिपॉजिटरी इंटरफ़ेस पर विचार कर रहे हैं कि सभी रिपॉजिटरी बाहर से समान दिखती हैं। लेकिन एक सामान्य, सामान्य इंटरफ़ेस का मूल्य किसी भी कार्यान्वयनकर्ता को यह जानने की आवश्यकता के बिना उपयोग करने की क्षमता है कि यह विशेष रूप से कौन सा है। जब तक आपके ऐप में कहीं ऐसा न हो जहां यह आवश्यक या उपयोगी होगा, YAGNI का कहना है कि ऐसा न करें।
देखने के लिए 5 ठोस सिद्धांत हैं। एस सिंगल रिस्पॉन्सिबिलिटी है। यह इंटरफ़ेस के बारे में कुछ नहीं कहता है, लेकिन यह आपके ठोस वर्गों के बारे में कुछ कह सकता है। यह तर्क दिया जा सकता है कि डेटा एक्सेस को संभालने के लिए सबसे अच्छा एक या अधिक अन्य वर्गों की जिम्मेदारी बन सकती है, जबकि रिपॉजिटरी की जिम्मेदारी एक निहित संदर्भ से अनुवाद करना है (CustomerRepository ग्राहक संस्थाओं के लिए स्पष्ट रूप से स्पष्ट कॉल में एक रिपॉजिटरी है। सामान्यीकृत डेटा एक्सेस API ग्राहक इकाई प्रकार निर्दिष्ट करता है।
O ओपन-क्लोज्ड है। यह ज्यादातर वंशानुक्रम के बारे में है। यह लागू होगा यदि आप अपने रिपॉजिटरी को सामान्य कार्यक्षमता को लागू करने वाले एक सामान्य आधार से प्राप्त करने की कोशिश कर रहे थे, या यदि आप विभिन्न रिपॉजिटरी से आगे प्राप्त करने की अपेक्षा करते हैं। लेकिन तुम नहीं हो, इसलिए यह नहीं है।
L, Liskov सबस्टिबिलिटी है। यदि आप सामान्य रिपॉजिटरी इंटरफ़ेस के माध्यम से रिपॉजिटरी का उपयोग करने का इरादा रखते हैं तो यह लागू होता है। यह निरंतरता सुनिश्चित करने के लिए इंटरफेस और कार्यान्वयन पर प्रतिबंध लगाता है और विभिन्न इम्पेलमेंटर्स के लिए विशेष हैंडलिंग से बचता है। इसका कारण यह है कि इस तरह की विशेष हैंडलिंग एक इंटरफ़ेस के उद्देश्य को कम करती है। इस सिद्धांत पर विचार करना उपयोगी हो सकता है, क्योंकि यह आपको सामान्य रिपॉजिटरी इंटरफ़ेस का उपयोग करने से दूर कर सकता है। यह YAGNI के मार्गदर्शन के साथ मेल खाता है।
मैं इंटरफ़ेस अलगाव है। यदि आप अपने रिपॉजिटरी में अलग-अलग क्वेरी ऑपरेशन जोड़ना शुरू करते हैं तो यह लागू हो सकता है। इंटरफ़ेस पृथक्करण लागू होता है जहां आप एक वर्ग के सदस्यों को दो सबसेट में विभाजित कर सकते हैं जहां एक का उपयोग कुछ उपभोक्ताओं द्वारा किया जाएगा और दूसरे का दूसरों द्वारा किया जाएगा, लेकिन कोई भी उपभोक्ता संभवतः दोनों सबसेट का उपयोग नहीं करेगा। मार्गदर्शन एक आम के बजाय दो अलग इंटरफेस बनाने के लिए है। आपके मामले में, यह संभव नहीं है कि अलग-अलग उदाहरणों को लाने और सहेजने का उपयोग उसी कोड द्वारा किया जाएगा जो सामान्य क्वेरी करते हैं, इसलिए उन लोगों को दो इंटरफेस में अलग करना उपयोगी हो सकता है।
डी डिपेंडेंसी इंजेक्शन है। यहाँ हम एस के समान बिंदु पर वापस आते हैं। यदि आपने डेटा एक्सेस API की अपनी खपत को एक अलग ऑब्जेक्ट में अलग कर दिया है, तो यह सिद्धांत कहता है कि उस ऑब्जेक्ट के उदाहरण को केवल नया करने के बजाय, आपको इसे बनाते समय पास करना चाहिए एक भंडार। इससे डेटा एक्सेस कंपोनेंट के जीवनकाल को नियंत्रित करना आसान हो जाता है, इससे आपकी रिपॉजिटरी के बीच संदर्भों को साझा करने की संभावना खुल जाती है, बिना इसे सिंगलटन बनाने के मार्ग पर जाने के।
यह नोट करना महत्वपूर्ण है कि अधिकांश SOLID सिद्धांत आवश्यक रूप से आपके ऐप के विकास के इस विशेष चरण में लागू नहीं होते हैं। उदाहरण के लिए, क्या आपको डेटा एक्सेस को तोड़ना चाहिए, यह इस बात पर निर्भर करता है कि यह कितना जटिल है, और क्या आप डेटाबेस से टकराये बिना अपने रिपॉजिटरी लॉजिक का परीक्षण करना चाहते हैं। ऐसा लगता है कि यह संभावना नहीं है (दुर्भाग्य से, मेरी राय में), इसलिए यह आवश्यक नहीं है।
इस तरह से विचार करने के बाद, हम पाते हैं कि YAGNI और SOLID वास्तव में ठोस, तुरंत-प्रासंगिक सलाह का एक सामान्य टुकड़ा प्रदान करते हैं: यह संभव नहीं है कि एक सामान्य जेनेरिक रिपॉजिटरी इंटरफ़ेस बनाया जाए।
यह सब सावधानीपूर्वक किया गया अध्ययन सीखने के रूप में बेहद उपयोगी है। जैसा कि आप सीखते हैं, यह समय लेने वाला है, लेकिन समय के साथ आप अंतर्ज्ञान विकसित करते हैं और बहुत जल्दी बन जाते हैं। आपको करने के लिए सही बात पता होगी, लेकिन इन सभी शब्दों को सोचने की ज़रूरत नहीं है जब तक कि कोई आपको यह बताने के लिए क्यों न कहे।