SOLID Design Principles | Complete Guide with Code Examples

Coder Army13,263 words

Full Transcript

हां जी। सो आज हम स्टार्ट करने जा रहे हैं अपनी एलएलडी के प्लेलिस्ट के एक बिल्कुल नए लेक्चर को जिसका नाम है सॉलिड डिजाइन प्रिंसिपल्स। अब ये प्रिंसिपल्स क्या होते हैं? कैसे अप्लाई करते हैं? उससे पहले हम एक थोड़ा सा ओवरव्यू ले लेते हैं कि अभी तक हमने क्या-क्या कर लिया है। तो अभी तक ना हमने ऊप्स के पिलर्स को देख लिया। हमने देखा एब्स्ट्रैक्शन, इनकैप्सुलेशन, इन्हहेरिटेंस, पॉलीमॉर्फिज्म ये सब क्या होते हैं। हमने देख लिया हम क्लासेस कैसे क्रिएट करते हैं? ऑब्जेक्ट्स कैसे क्रिएट करते हैं? उन क्लासेस में हम डेटा हाइड कैसे करते हैं? डेटा सिक्योरिटी कैसे मेंटेन करते हैं? राइट? पर जब आप एक रियल वर्ल्ड प्रोजेक्ट की बात करते हो ना, तो उसमें थाउजेंड्स ऑफ क्लासेस बनती हैं। अब आप इमेजिन करो इतनी सारी क्लासेस को मैनेज करना कितना मुश्किल होता होगा। तो ऐसे कौन से प्रिंसिपल्स हैं या कौन से रूल हैं जो हम अगर फॉलो करें तो हम इतनी सारी क्लासेस को भी एक साथ मैनेज कर पाएंगे। क्योंकि अगर वहां हमने गंदा कोड लिखा वहां हमने मेस कर दिया उन क्लासेस के साथ तो हमारे साथ क्या होगा? आपको पता है बहुत डिजास्टरस बग्स इंट्रोड्यूस हो जाएंगे। एक रियल वर्ल्ड एप्लीकेशन में जब बग्स इंट्रोड्यूस होते हैं तो सिर्फ अ टेक्निकल लेवल पे उसका नुकसान नहीं होता। मॉनिटरी लेवल पे भी उसका नुकसान होता है। तो हमें इस तरह कोड लिखना होता है जो क्लीनर हो। दूसरे को इजीली समझ आ जाए और एक आर्किटेक्चर को मेंटेन करके रखें। तो यही आज हम इस पूरे के पूरे लेक्चर में पढ़ने वाले हैं। इसको समझने वाले हैं। चलो पहले एक रियल वर्ल्ड प्रॉब्लम की बात करते हैं और फिर इसको कोड के तरीके से समझेंगे। सपोज़ करो एक घर है जिसमें ना बहुत सारी वायरिंग जा रही है एक जगह से। ठीक है? अब उसमें लेट्स से इलेक्ट्रिकल वायरिंग्स होनी हो सकती है। उसमें इंटरनेट वायरिंग्स की इंटरनेट की वायर्स हो सकती है और उसमें लेट से पाइप्स भी हो सकते हैं। और वो सब एक ही तरफ से एक ही जगह से जा रहा है और बिल्कुल एक मेस बन गया है। ठीक है? अब सपोज करो उसमें से किसी भी वायर में अगर कुछ फौल्ट आता है तो ये पता लगाना कि फौल्ट किस वायर में हुआ है। उस अ उस प्रॉपर वायर को रिप्लेस करना कितना मुश्किल है। क्योंकि हर चीज आपस में बहुत ज्यादा टाइटली कपल्ड है। है ना? प्रोग्रामिंग में भी ऐसा ही होता है। अगर आपकी एप्लीकेशन में आपने अपनी जो क्लासेस बनाई हैं और उनको इस तरह बना दिया कि वो एक दूसरे से ना बहुत ही ज्यादा टाइटली कपल्ड हो गई या पूरा का पूरा एक मेस बन गया वहां पे। तो आप इमेजिन कर सकते हो कभी अगर कोई बग आ जाए तो उसे रजॉल्व करना कितना मुश्किल होगा। एक नए फीचर को अपनी एप्लीकेशन के अंदर लेकर के आना कितना मुश्किल होगा। है ना? तो ये सब जो प्रॉब्लम डेवलपर्स फेस करते हैं रियल वर्ल्ड में ये फेस ना कर पाएं। उसी को कम करने के लिए हम डिज़ाइन प्रिंसिपल्स की बात करते हैं। तो चलो आ जाओ स्क्रीन पे। बिल्कुल स्टार्ट करते हैं। आपको बहुत मजा आएगा। चलो। तो सबसे पहले हम बात करते हैं प्रॉब्लम्स की। कि क्या-क्या प्रॉब्लम्स होती हैं एक रियल वर्ल्ड प्रोजेक्ट में अगर हम डिजाइन प्रिंसिपल्स को फॉलो नहीं करते या बेसिकली अगर फॉलो भी करते हैं अगर हम सही से फॉलो नहीं करते तो देखो सबसे पहले ना मेंटेनेबिलिटी का इशू होता है। बेसिकली क्या मतलब है इसका कि आपको अपना कोड मेंटेन करना आना चाहिए। बेसिकली आपकी एप्लीकेशन मेंटेनेल हो। राइट? इसका क्या मतलब हुआ? अगर आपकी एप्लीकेशन में हम कोई नया फीचर इंटीग्रेट करें तो वो ईजीली इंटीग्रेट हो जाए। ज्यादा कोड चेंजज़ ना करने पड़े। ठीक है? उसमें नए बग्स ना इंट्रोड्यूस हो जाए उस फीचर को इंटीग्रेट करने के लिए। तो ये मेंटेनेबिलिटी के प्रॉब्लम आती है। ठीक है? सेकंड प्रॉब्लम जो आती है वो आती है रीडेबिलिटी की। तो इसकी क्या प्रॉब्लम है? देखो ये वो बताता है कि लेट्स से आपकी एप्लीकेशन में कुछ नए इंजीनियर्स जुड़े हैं जो इसमें कोड करना चाहते हैं। अब आपकी एप्लीकेशन इतनी कॉम्प्लिकेटेड, इतनी टाइटली कपल्ड लिखी हुई है ना कि किसी भी नए इंजीनियर्स को वो कोड समझने में बहुत मेहनत लगेगी। वो उसका रीडेबिलिटी इंडेक्स बहुत हाई है। मतलब उसको समझने के लिए ही बहुत टाइम वेस्ट करना पड़ेगा। राइट? तो यह प्रॉब्लम आती है रीडेबिलिटी की। तो हमने देखा मेंटेनेबिलिटी एक प्रॉब्लम हो सकती है। रीडेबिलिटी एक प्रॉब्लम हो सकती है। है ना? और एक एप्लीकेशन में जो सबसे ज्यादा कॉमन प्रॉब्लम्स हैं वो हैं कि हम बहुत सारे बग्स इंट्रोड्यूस कर देते हैं और इन बग्स को रिजॉल्व करने के लिए हमें बहुत ज्यादा टाइम डीबगिंग में लगाना पड़ता है। तो ये कुछ प्रॉब्लम्स हैं जो एक एप्लीकेशन में हम फेस करते हैं। ठीक है? अब इन प्रॉब्लम्स को ही सॉल्व करने के लिए किसी महान इंसान ने कुछ ऐसे प्रिंसिपल्स बनाए। कुछ ऐसे डिजाइन प्रिंसिपल्स बनाएं कि अगर आप उनको एक-एक करके फॉलो कर लो अपने कोड में तो ये प्रॉब्लम कभी आएगी ही नहीं। आपका कोड एकदम क्लीनर होगा। आपका आर्किटेक्चर एकदम मैनेजेबल होगा। तो सबसे पहले आपको ये जानने की जरूरत नहीं है कि वो महान इंसान कौन है बट क्रेडिट देना चाहिए लोगों को। तो हम जान लेते हैं उन महान इंसान का नाम है रॉबर्ट सी मार्टिन। 2000 में इन्होंने ये कंप्यूटर साइंटिस्ट थे। इन्होंने एक पेपर पब्लिश किया था जिनमें इन्होंने इस डिज़ाइन पैटर्न्स डिजाइन प्रिंसिपल्स की बात की थी। ठीक है? तो वो डिजाइन प्रिंसिपल्स क्या हैं? पहले हम उसको समझ लेते हैं और एक-एक करके सारे डिजाइन प्रिंसिपल्स को करेंगे और उसे प्रैक्टिकल एग्जांपल्स के साथ समझेंगे। आपको सारी चीजें एकदम क्रिस्टल क्लियर हो जाएगी इस लेक्चर के बाद और ये एकदम इन डेप्थ रहेगा। चलो स्टार्ट करते हैं। देखो सबसे पहले तो हम इन डिज़ाइन प्रिंसिपल को का जो एक्रोनिम है वो है सॉलिड। ठीक है? इसलिए हम इन्हें सॉलिड डिजाइन प्रिंसिपल बोलते हैं। ये एक्रोनियम है। क्या मतलब है सॉलिड का? देखो एक-एक करके समझते हैं। सबसे पहले ये जो s है इसका मतलब होता है सिंगल रिस्पांसिबिलिटी प्रिंसिपल। ओके? इसको हम एसआरपी भी बोलते हैं। ठीक है? इसके अलावा जो हमारे पास ओ है, एल है, आई है और डी है। इन सबको एक बार इंट्रोड्यूस कर लेते हैं फटाफट से। ओ का मतलब होता है हमारा ओपन क्लोज प्रिंसिपल। ठीक है? इसको हम ओएसपी बोलते हैं। ओसीपी बोलते हैं। सॉरी। अगला हमारा होता है लिस्क ऑफ सब्सीट्यूशन प्रिंसिपल। इसको हम बोलते हैं एलएसपी। अगला हमारा होता है इंटरफेस सेग्रगेशन प्रिंसिपल। इसको हम बोलते हैं आईएसपी। और लास्ट हमारा होता है डिपेंडेंसी इन्वर्जन प्रिंसिपल। डिपेंडेंसी इन्वर्जन प्रिंसिपल और इसको हम बोलते हैं डिप डीआईपी। तो ये पांच प्रिंसिपल्स हैं जो मिलाकर के सॉलिड डिजाइन प्रिंसिपल्स कहलाते हैं। यह प्रिंसिपल्स फॉलो करने के बाद जैसे कि हमने अभी ऊपर बात की कि आपको कोई प्रॉब्लम नहीं आएगी अपना कोड लिखने में। आपका कोड एकदम क्लीनर रहेगा। तो एक-एक करके इन डिज़ाइन प्रिंसिपल्स की हम बात करते हैं और इन्हें समझते हैं। चलो। तो सबसे पहले आ जाते हैं एस पे जो कि क्या था? सिंगल रिस्पांसिबिलिटी प्रिंसिपल। ठीक है? तो सबसे पहले इसकी बात कर लेते हैं। तो पहले मैं इसकी डेफिनेशन दूंगा और फिर हम समझेंगे कि ये होता क्या-क्या है? सो ये है इसकी डेफिनेशन। सिंगल रिस्पांसिबिलिटी प्रिंसिपल कहता है अ क्लास शुड हैव ओनली वन रीज़न टू चेंज। या फिर इट शुड डू ओनली वन थिंग। क्या मतलब है इसका? देखो, सिंपल सा अगर शब्दों में समझें तो एक क्लास है। ठीक है? वो इस तरह लिखी होनी चाहिए कि वो सिर्फ एक ही काम करे। मतलब एक क्लास की एक ही रिस्पांसिबिलिटी होनी चाहिए। यानी कि उस क्लास को चेंज करने के लिए एक ही रीज़ होना चाहिए हमारे पास। क्या मतलब है इसका कहने का? हम बस इतना कहना चाहते हैं कि एक क्लास मल्टीपल रिस्पांसिबिलिटीज़ हैंडल ना करे। वो एक ही काम करे। एक क्लास एक काम। सिंपल। इसका अगर एक रियल वर्ल्ड एनालॉजी से हम एग्जांपल समझें तो जैसे कि एक टीवी रिमोट होता है। राइट? तो टीवी रिमोट का काम होता है टीवी को कंट्रोल करना। तो इसमें सारे बटंस टीवी को कंट्रोल करने के लिए बने होते हैं। तो अगर मान लो उसी रिमोट से हम फ्रिज भी कंट्रोल कर पा रहे हो, एसी भी कंट्रोल कर पा रहे हो तो चीजें बहुत कॉम्प्लिकेट हो जाएगी। राइट? उसमें इतने सारे फंक्शनंस को इंटीग्रेट करना पड़ेगा और अगर कुछ खराब हुआ तो उसे मेंटेन करने की बड़ी दिक्कत होगी। तो इसलिए सिंगल रिस्पांसिबिलिटी प्रिंसिपल हमें यही बताता है कि हम अपनी क्लासेस को इस तरह डिजाइन करें कि वो एक ही रिस्पांसिबिलिटी को हैंडल करें और उस क्लास के जितने भी एट्रिब्यूट्स हैं एंड जितने भी मेथड्स हैं वो सब मिला के उसी रिस्पांसिबिलिटी को ही हैंडल कर रहे हो। उसके अलावा कोई और रिस्पांसिबिलिटी वो ना लें। ठीक है? तो ये तो बेसिक है सिंगल रिस्पांसिबिलिटी प्रिंसिपल जो कहता है। अब इसे थोड़ा सा एक बार एग्जांपल के रूप में समझते हैं कि हम उसे कैसे फॉलो कर सकते हैं और क्यों इसे फॉलो करना चाहिए। ठीक है? चलो। तो हम एक हमने यूएमएल डायग्राम तो पढ़े ही हैं। राइट? अब हम क्या करते हैं? यूएमएल डायग्राम्स के थ्रू ही हम क्लास डायग्राम्स बनाएंगे और एग्जांपल समझेंगे और फिर उसके बाद हम उसका कोड देखेंगे। तो सबसे पहले इमेजिन करो कि आपके पास एक प्रोडक्ट क्लास है। ठीक है? ये कौन सा प्रोडक्ट है? कोई भी जो किसी ई-कॉमर्स वेबसाइट पे आपको मिल जाएगा। ठीक है? ये आपको अ लेट्स से Amazon पे मिल सकता है। Flipkart, MNTRa किसी भी ई-कॉमर्स वेबसाइट पे कोई प्रोडक्ट जो होता है ये वही प्रोडक्ट क्लास है। और इसके पास सिर्फ दो चीजें हैं। लेट्स से प्रोडक्ट का प्राइस और प्रोडक्ट का नाम सिंपल और कुछ नहीं है इसके पास। ऑब्वियसली हम पूरा का पूरा ईएमएल ड्रॉ नहीं कर रहे। हम सारे एक्सेस मॉडिफायर प्लस माइनस#श से शो नहीं कर रहे और इसका रिटर्न टाइप वगैरह। पर अभी आप समझने के लिए समझो कि हम कहना क्या चाहते हैं। तो हमने एक प्रोडक्ट क्लास बना दी जो एक प्रोडक्ट है जिसके उसके पास उसका सिर्फ नाम है और उसका सिर्फ प्राइस है। ठीक है? अब एक हम काम करते हैं। ठीक है? हम एक शॉपिंग कार्ड बनाते हैं। अब हर प्रोडक्ट एक कार्ड में ऐड करता है यूजर। ठीक है? तो उसका एक कार्ड होना चाहिए। तो हम एक शॉपिंग कार्ड नाम से एक क्लास बना लेते हैं। तो यह शॉपिंग कार्ड क्लास है जो बेसिकली इस यूएमएल डायग्राम से हम रिप्रेजेंट करते हैं। अब कार्ट और प्रोडक्ट में क्या रिलेशनशिप है? मैं कहता हूं कि ये जो शॉपिंग गार्ड है उसमें हैज़ अ का रिलेशनशिप है। राइट? मैंने हैज़ अ गलत बनाया। एज आई एज वी डिस्कस्ड इन द लास्ट लेक्चर हमें ओपन एरो रखना चाहिए। राइट? तो हैज़ अ का रिलेशनशिप है। बेसिकली शॉपिंग कार्ड हैज़ प्रोडक्ट। और सिर्फ हैज़ प्रोडक्ट नहीं बल्कि शॉपिंग कार्ड हैज़ मेनी प्रोडक्ट। एक कार्ड में आप मल्टीपल प्रोडक्ट को ऐड कर सकते हो। और ये किसी यूएमएल डायग्राम में दिखाने के लिए हम क्या लिखते हैं? हम ऐसे लिखते हैं वन डॉट डॉट स्टार। इसका मतलब होता है कि इस शॉपिंग कार्ड में इस शॉपिंग कार्ड के अंदर हम मल्टीपल प्रोडक्ट्स को रख सकते हैं। ठीक है? ये याद रख लेना। बस ये बताना था। चलो वापस जंप करते हैं कि हम क्या कह रहे थे कि लेट्स से हमारे पास एक प्रोडक्ट क्लास है जिसके पास प्राइस और नेम है और हमारे पास एक शॉपिंग कार्ड की क्लास है जिसके पास बहुत सारे प्रोडक्ट की लिस्ट हैं। ठीक है? तो ये उस प्रोडक्ट की लिस्ट को अपने पास मेंटेन करके रखता है। अब हम क्या करते हैं कि इस शॉपिंग कार्ड के मेथड्स लिखते हैं कि क्या-क्या हो सकते हैं। तो लेट्स से एक शॉपिंग कार्ड का मेथड होगा। अ कैलकुलेट टोटल प्राइस। ठीक है? तो वो क्या करेगा? बेसिकली सारे प्रोडक्ट्स में लिस्ट डाउन करेगा। उन सबके अ प्राइसेस को एक साथ सम अप करेगा और टोटल प्राइस को कैलकुलेट करके दिखाएगा। सही बात है। इसके अलावा और क्या मेथड हो सकता है किसी शॉपिंग कार्ड के अंदर? लेट्स से वो इनवॉइस भी प्रिंट करता है। तो जितने भी आपके सारे कार्ड के आइटम्स हैं उनका इनवॉइस टोटल बिल जो बैठा है उसको भी प्रिंट करता है। तो हम इसका नाम रखते हैं प्रिंट इनवॉइस फंक्शन। तो ये इनवॉइस भी प्रिंट करता है। इसके अलावा लेट्स इमेजिन कि शॉपिंग कार्ड के अंदर एक और मेथड है जिसका नाम है सेव टू डीबी। तो ये जितने भी आपने कार्ड में आइटम ऐड करे हैं उनको वो डेटाबेस में भी स्टोर कर लेता है। ठीक है? तो हम सेव टू डीबी करके भी एक मेथड बना लेते हैं। ये भी शॉपिंग कार्ड के अंदर प्रेजेंट है। ठीक है? तो अगर आप ध्यान से देखो तो इसमें जो हमारी ये जो शॉपिंग कार्ड की क्लास है ना ये सिंगल रिस्पांसिबिलिटी प्रिंसिपल को ब्रेक कर रही है। क्योंकि हमने कहा था सिंगल रिस्पांसिबिलिटी प्रिंसिपल में कि क्लास शुड हैव ओनली वन रिस्पांसिबिलिटी। पर ये देखो कितनी सारी रिस्पांसिबिलिटीज एक साथ ले रही है। ये टोटल प्राइस भी कैलकुलेट कर रही है। ये उसको पर उसको इसका इनवॉइस भी प्रिंट कर रही है और उसको डीबी में भी पर्सिस्ट कर रही है। तो ये मल्टीपल रिस्पांसिबिलिटीज हैंडल कर रही है एक साथ। तो इससे दिक्कत क्या होती है? इससे ये दिक्कत होगी कि कल को अगर हमें डेटाबेस में स्टोर करने के लॉजिक को बदलना हो तो हमें इस क्लास में चेंज करना पड़ेगा। अगर हमें इनवॉइस प्रिंटिंग के लॉजिक को बदलना हो तो जाके हमें इस क्लास में चेंज करना पड़ेगा। और अगेन सेम अगर हमें टोटल प्राइस कैलकुलेट करने का लॉजिक चेंज करना हो तो जाके हमें इस क्लास में चेंज करना पड़ेगा। तो देयर आर मल्टीपल रीज़ंस कि हमें इस क्लास के अंदर चेंजज़ करने पड़ रहे हैं। इसी को कहते हैं जब एसआरपी यानी कि सिंगल रिस्पांसिबिलिटी प्रिंसिपल ब्रेक होता है। ठीक है? अब हम नहीं चाहते ये ब्रेक हो। हम चाहते हैं हम इसको फॉलो करें। ठीक है? क्योंकि हमें सारे प्रिंसिपल्स फॉलो करने हैं क्या करेंगे? तो हम चाहते हैं इसे फॉलो करें। तो हम इसे फॉलो कैसे कर सकते हैं? तो इसको फॉलो करने के लिए ना हम कंपोजशन का बहुत ज्यादा यूज करने वाले हैं। तो जो हमने लास्ट लेक्चर में पढ़ा था कंपोज़िशन उसका हम बहुत ज्यादा यूज़ करने वाले हैं। तो चलो एक-एक करके देखते हैं कि हम इसको कैसे फॉलो करवा सकते हैं। ठीक है? तो देखो अभी हमें दिक्कत क्या आ रही थी? हमें दिक्कत ये आ रही थी कि शॉपिंग कार्ट मल्टीपल चीजें एक साथ हैंडल कर रही थी एक ही क्लास के अंदर। तो एक काम करते हैं ना इसको मल्टीपल क्लासेस में ब्रेकडाउन कर देते हैं। ठीक है? तो अब हम एक काम करेंगे। हमारे पास एक शॉपिंग कार्ड थी। इसको हम मिटा देते हैं। यहां से हटा देते हैं। शॉपिंग कार्ड नहीं है अब हमारे पास। ठीक है? और हम मल्टीपल फंक्शनंस बनाते हैं। तो ये हमारे पास प्रोडक्ट तो था ही। तो सबसे पहले अब हम मल्टीपल क्लासेस बनाते हैं। तो सबसे पहले तो हमारे पास शॉपिंग कार्ड के नाम से एक क्लास है जो अभी पहले भी थी। ठीक है? हमने बस उसको भी खाली कर दिया। अभी हमने उसमें बहुत सारे फंक्शनंस भरे हुए थे। अभी हमने उसे उसे खाली कर दिया। क्या-क्या फंक्शन थे शॉपिंग कार्ड में? वो अ डेटाबेस में स्टोर कर रही थी। वो इनवॉइस प्रिंट कर रही थी और वो टोटल प्राइस को कैलकुलेट कर रही थी। मैं कह रहा हूं इन तीनों में से ना मुझे लगता है शॉपिंग कार्ड को एक ही काम करना चाहिए जो कि है टोटल प्राइस कैलकुलेट करना। तो कैलकुलेट सॉरी कैलकुलेट टोटल प्राइस ये तो इसके अंदर रहेगा शॉपिंग कार्ड के अंदर। इसके अलावा शॉपिंग कार्ड के अंदर ना तो इनवॉइस प्रिंटिंग का लॉजिक होना चाहिए ना तो डेटाबेस पर्सिस्टेंस का लॉजिक होना चाहिए। इसके लिए हम दो अलग-अलग क्लासेस बना लेते हैं। तो लेट्स से एक हम क्लास बना लेते हैं यहां पे। ठीक है? इस क्लास का नाम है लेट से शॉपिंग कार्ड इनवॉइस प्रिंटर बहुत बड़ा नाम है पर ऑब्वियसली बड़ा नाम इज़ बेटर क्योंकि शॉर्ट नाम हमेशा डिस्क्रिपेंसी या कंफ्यूजन क्रिएट करते हैं। तो हमने कार्ट इनवॉइस प्रिंटर बना लिया और हमने लेट्स से एक और अ क्लास बना ली कार्ट अ डीबी स्टोरेज कुछ भी आप नाम रख सकते हो पर डेटाबेस की स्टोरेज के लिए क्लास बना ली। ठीक है? तो अब हम इन क्लासेस में क्या करते हैं? हम इन क्लासेस में वो मेथड स्टोर करते हैं जो हमने यहां से निकाले थे। तो इनवॉइस प्रिंटर का काम होना चाहिए प्रिंट इनवॉइस मेथड को कॉल करना और डीबी स्टोरेज का काम होना चाहिए अ डेटाबेस में चीजों को स्टोर करना। तो सेव टू डीबी। अब ये काम किसके ऊपर करेंगे? ये दोनों क्लासेस काम करेंगी शॉपिंग कार्ड के ऊपर। यानी कि इन दोनों क्लासेस के पास भी शॉपिंग कार्ड का रेफरेंस होना चाहिए। तो इनका भी हैज़ अ रिलेशनशिप है शॉपिंग कार्ड के साथ। और शॉपिंग कार्ड का वन टू मेनी रिलेशनशिप तो था ही प्रोडक्ट के साथ। इनका वन टू वन रिलेशनशिप है। तो एक अ इनवॉइस प्रिंटर के पास भी शॉपिंग कार्ड का एक ऑब्जेक्ट एक रेफरेंस है। सेम डीबी स्टोरेज के पास भी शॉपिंग कार्ड का एक रेफरेंस है। तो इसको हम डिनोट कैसे करते हैं? बेसिकली अगर आप ध्यान से देखो तो हम यहां पे ऐसे लिख सकते हैं यहां पे ऊपर कि शॉपिंग कार्ड का नाम से एससी करके हमने एक अ रेफरेंस बना लिया स्टार एससी करके सेम हमने यहां पे भी लिख सकते हैं। यहां पे भी हम शॉपिंग कार्ड का एक रेफरेंस स्टोर कर सकते हैं एससी करके। ठीक है? तो हमारे पास ये यूएमएल डायग्राम बना। तो अब हमने क्या किया? एक शॉपिंग कार्ड क्लास को मल्टीपल क्लासेस में ब्रेकडाउन कर लिया। अब ध्यान से देखो। तो ये सिंगल रिस्पांसिबिलिटी प्रिंसिपल को बहुत अच्छे से फॉलो कर रहे हैं। क्योंकि शॉपिंग कार्ड एक रिस्पांसिबिलिटी हैंडल कर रही है टोटल प्राइस कैलकुलेट करने का। सेम इनवॉइस प्रिंटर क्लास प्रिंट कर रही है इनवॉइसेस को और डीबी स्टोरेज डेटाबेस में स्टोर कर रही है। अब कोई भी क्लास मल्टीपल रिस्पांसिबिलिटीज़ को हैंडल नहीं कर रही है और पूरा का पूरा स्ट्रक्चर अब एकदम बढ़िया हो गया। अब आप ध्यान से सोचो। अगर हमें सिर्फ डेटाबेस स्टोर करने के लॉजिक को चेंज करना है तो हमें सिर्फ इस क्लास में चेंज करना पड़ेगा। सेम अगर हमें किसी और जैसे डीबी पर्सिस्टेंस सॉरी इनवॉइस प्रिंटिंग के लॉजिक को चेंज करना है तो हमें सिर्फ इस क्लास में चेंज करना पड़ेगा। है ना? तो यहां पे हमने सारी की सारे चीजों को अलग-अलग सेपरेट कर दिया और सिंगल रिस्पांसिबिलिटी प्रिंसिपल को फॉलो करवा दिया। अब यही जो हमने यूएमएल डायग्राम देखा इसको कोड के थ्रू देखते हैं। आपको ज्यादा बेटर समझ आएगा। तो आ जाओ कोड देखते हैं। तो ये रहा स्क्रीन पे आपका कोड सिंगल रिस्पांसिबिलिटी प्रिंसिपल। बिल्कुल वही कोड है जो अभी तक हमने देखा। सबसे पहले हमने क्या किया? एक प्रोडक्ट क्लास बना ली। उसके पास नेम है और प्राइस है प्रोडक्ट का और यह हमने उसका कंस्ट्रक्टर बना लिया। ठीक है? अब देखो, हमने क्या किया था? हमने कहा था एक प्रोडक्ट क्लास एक शॉपिंग कार्ड के अंदर मल्टीपल प्रोडक्ट हो सकते हैं। तो हमने एक वेक्टर बना लिया। प्रोडक्ट्स की लिस्ट बना ली। ठीक है? उसके अंदर मल्टीपल प्रोडक्ट है तो हैज़ अ रिलेशनशिप है। अब हमने इस प्रोडक्ट इस शॉपिंग कार्ड के मेथड्स बनाए। तो अभी हम वो वाला केस देख रहे हैं जिसमें हम सिंगल रिस्पांसिबिलिटी प्रिंसिपल को फॉलो नहीं कर रहे थे। तो इसमें सबसे पहले तो मैंने गेटर सेटर बना लिया। अब गेटर सेटर एग्जैक्टली नहीं है। एक तो है ऐड प्रोडक्ट जो एक-एक करके प्रोडक्ट ऐड करेगा इस वेक्टर में। तो एक तरह से गेटर का काम कर रहा है सॉरी सेटर का काम कर रहा है और एक है गेटर जो सारे प्रोडक्ट्स को एक साथ गेट करके दे देगा। तो ये तो हमेशा गुड प्रैक्टिस है। आपको रखना चाहिए। उसके बाद जो हमने डिस्कस किया था एक तो कैलकुलेट टोटल प्राइस। ये हमने एक मेथड बनाया हुआ है जो क्या करता है? लूप थ्रू करता है इस पूरी की पूरी लिस्ट में और टोटल प्राइस कैलकुलेट कर देता है। क्योंकि हर उसके पास प्रोडक्ट के पास अपना प्राइस होता है। ठीक है? सेकंड फंक्शन है हमारा प्रिंट इनवॉइस का। ये क्या करता है? अगेन लूप थ्रू करता है सारे के सारे प्रोडक्ट पे और उसको इनवॉइस उसका इनवॉइस प्रिंट कर देता है। कैसे बस लिख देता है टोटल जो भी उसका फाइनल वैल्यू आती है और खत्म। ठीक है? और लास्ट हमने फंक्शन बनाया था सेव टू डेटाबेस का जो कुछ ना कुछ डेटाबेस स्टोरिंग के लिए कुछ ना कुछ लॉजिक लिखता है। अब ऑब्वियसली डिपेंड करेगा आप डेटाबेस से कनेक्ट कैसे करते हो एंड ऑल दैट। तो वो सब हम वहां हैंडल नहीं कर रहे हैं। अभी हम सिंपल प्रिंट कर रहे हैं सेविंग शॉपिंग कार्ड टू डेटाबेस। ठीक है? अब अगर आप ध्यान से देखो इसमें सारे के सारे चीजें एक ही मेथड में आ गई जैसे हमने डिस्कस किया था तो ये सारी एसआरपी को वायलेट कर रही हैं। ठीक है? और अगर आप ध्यान से देखो अगर हम मेन फंक्शन में हमने क्या किया यहां पे? हमने एक शॉपिंग कार्ड का ऑब्जेक्ट बनाया सबसे पहले। उसमें दो प्रोडक्ट ऐड किए। एक हमने लैपटॉप ऐड किया 1500 का एक माउस ऐड किया ₹50 का। उसके बाद हमने क्या किया? एक तो उसमें प्रिंट इनवॉइस कॉल किया। एक तो सेव टू डेटाबेस कॉल किया। अब जब हम ये सब कुछ कॉल किया तो सब कुछ चल जाएगा। लेकिन सिंगल रिस्पांसिबिलिटी प्रिंसिपल हमारा ब्रेक होगा। तो देखो हो गया। सबसे पहले इनवॉइस प्रिंट हो गया शॉपिंग कार्ड का और फिर हमने कहा कि को डेटाबेस में हम स्टोर कर रहे हैं। चलो बहुत बढ़िया। अब हम कोड देखते हैं उसका कि जब हमने सिंगल रिस्पांसिबिलिटी प्रिंसिपल को प्रॉपर्ली फॉलो किया। तो ये रहा स्क्रीन पे एसआरपी का वो कोड जिसमें हमने सिंगल रिस्पांसिबिलिटी प्रिंसिपल को प्रॉपर्ली फॉलो किया है। तो एक बार ध्यान से देखते हैं। सेम है सब कुछ। हमने प्रोडक्ट क्लास बनाई। हमने शॉपिंग कार्ड में से वो सारे फालतू फंक्शनंस निकाल दिए जो हमें नहीं चाहिए। हमने बस अपने दो फंक्शन रखे। एक तो टोटल प्राइस कैलकुलेट करने का और उसके डेटर सेटर्स। ठीक है? इसके अलावा फिर हमने क्या किया? हमने सारे के सारे क्लासेस को अलग-अलग बना दिया। जैसे कि शॉपिंग कार्ड, प्रिंटर क्लास अलग बन गई। वैसे ही शॉपिंग कार्ड स्टोरेज क्लास अलग बन गई। ये जो प्रिंटर क्लास है इसका काम है शॉपिंग कार्ड का इनवॉइस प्रिंट करना। तो ये देखो यहां पे हमने रेफरेंस ले लिया एक कार्ड के ऑब्जेक्ट का। अगेन जैसे हमने बात किया था हैज़ अ रिलेशनशिप है। और ये वही फंक्शन कॉल कर रही है। प्रिंट इनवॉइस बिल्कुल सेम फंक्शन है। कुछ चेंज नहीं है इसमें। सेम हमने शॉपिंग कार्ड स्टोरेज में भी रेफरेंस ले लिया शॉपिंग कार्ड का और उसमें सेव टू डेटाबेस का एक मेथड कॉल करा लिया। बिल्कुल सेम मेथड है। कोई इसमें चेंज नहीं है। बस अब दो अलग-अलग क्लासेस बन गई एक क्लास की तरह और मेन फंक्शन भी एकदम डिट्टो सेम है। बस अब ये फायदा हुआ हमें कि सारी चीजें, सारी क्लासेस अब अलग-अलग हो गई और सबकी रिस्पांसिबिलिटीज अब अलग-अलग हो गई। तो यही था कोड। वापस आते हैं स्क्रीन पे। तो एसआरपी को कंक्लूड करने से पहले हम एक चीज डिस्कस कर लेते हैं जो बहुत लोगों को एसआरपी में ये कंफ्यूजन लगती है कि लोगों को लगता है कि जब हम कहते हैं ना सिंगल रिस्पांसिबिलिटी प्रिंसिपल एक क्लास एक ही रिस्पांसिबिलिटी हैंडल करे तो लोगों को लगता है एक क्लास में एक ही मेथड होना चाहिए। जैसे इस एग्जांपल में भी सबके पास एक ही मेथड था। पर ऐसा नहीं है। सिंगल रिस्पांसिबिलिटी प्रिंसिपल का मतलब ये नहीं होता है क्लास में एक ही मेथड होना चाहिए। इसका मतलब ये होता है कि एक क्लास में कितने मर्जी मेथड्स हो सकते हैं। पर सारे मेथड्स का काम सारे मेथड्स का रिस्पांसिबिलिटी एक ही होनी चाहिए। जैसे फॉर एग्जांपल हमने शॉपिंग कार्ड में ये हमने जो एग्जांपल लिया था कैलकुलेट टोटल प्राइस तो ये टोटल प्राइस कैलकुलेट कर रहा है। अब इसको कैलकुलेट करने के लिए लेट्स से आपको तीन-चार मेथड्स की और जरूरत पड़ती है। कुछ हेल्पर फंक्शन की जरूरत पड़ती है तो आप वो क्रिएट करो आराम से क्रिएट करो। लेकिन ये सब मिलाकर के एक ही काम करने चाहिए। सेम डेटाबेस स्टोरिंग के लिए अभी तो हमने सी सिंपल लिख दिया सेव टू डीबी। पर ऑब्वियसली उसमें मल्टीपल फंक्शनंस की जरूरत पड़ेगी। पर वो सारे मेथड्स मिलके एक ही काम करेंगे जो कि है डेटाबेस स्टोरेज का। तो ये पूरा का पूरा है सिंगल रिस्पांसिबिलिटी प्रिंसिपल। आई होप आपको क्लियर हुआ होगा। चलो जंप करते हैं अपने सेकंड सॉलिड डिजाइन प्रिंसिपल पे जिसका नाम है ओपन क्लोज प्रिंसिपल। तो ओ स्टैंड्स फॉर ओपन क्लोज प्रिंसिपल। चलो अब इसे स्टार्ट करते हैं। तो सबसे पहले इसकी डेफिनेशन देखते हैं। तो ये है ओपन क्लोज प्रिंसिपल की डेफिनेशन। अ क्लास शुड बी ओपन फॉर एक्सटेंशन बट क्लोज फॉर मॉडिफिकेशन। क्या मतलब है इसका? देखो, मॉडिफिकेशन का मतलब होता है पुराने कोड को चेंज करना। बेसिकली पुरानी क्लास में जाकर के जो भी आपने लिखा हुआ है मेथड्स उसको चेंज करना। और एक्सटेंशन का मतलब होता है नए फीचर को ऐड करना। तो ओपन क्लोज प्रिंसिपल ये कहता है कि कोई भी नए फीचर को ऐड करने के लिए हम पुरानी क्लासेस के कोड को चेंज ना करें। हम पुराने कोड को ही टच ना करें। तो अब आप कहोगे भैया ये कैसा कांसेप्ट है? पुराने कोड में तो चेंजिस करने पड़ेंगे। पर ये ओपन क्लोज प्रिंसिपल आपको ये बताता है कि कोई नया फीचर को इंटीग्रेट करने के लिए आप जो पुरानी ऑलरेडी बनी हुई क्लासेस जो है ना उसके मेथड्स में जाकर के कोई नया मेथड मत लिख दो। बेसिकली उसकी क्लासेस में जा क्लास में जाकर के कोई नया मेथड मत लिख दो। ये बहुत स्ट्रिक्ट रूल है। बहुत हाई लेवल पे मुझे नहीं लगता बहुत कंक्रीट लेवल पे या बिल्कुल आइडियलिस्टिक लेवल पे इसको हर जगह एब्सोलुटली फॉलो किया जाता है। कोशिश करनी चाहिए कि ओपन क्लोज प्रिंसिपल को आप जितना ज्यादा फॉलो कर पाओ उतना बेटर है। वो हम लास्ट में बात करेंगे वैसे पर पहले प्रिंसिपल समझते हैं। तो ओपन क्लोज प्रिंसिपल यही कह रहा है कि अ क्लास शुड बी ओपन फॉर एक्सटेंशन एंड क्लोज फॉर मॉडिफिकेशन। ठीक है? अब कैसे हो सकता है ये? मतलब अगर हमें एक नया फीचर इंटीग्रेट करना है और हम कह रहे हैं हम कोई ऑलरेडी एकिस्टिंग कोड को चेंज ही ना करें। है ना? तो ये कैसे पॉसिबल होगा? तो पहले हम देखते हैं प्रॉब्लम क्या आती है? फिर हम देखेंगे पॉसिबल कैसे होगा। ठीक है? तो अपने पुराने एग्जांपल की तरफ ही चलते हैं। ठीक है? उस एग्जांपल में हमारे पास क्या था? देखो हमारे पास सबसे पहले तो एक प्रोडक्ट था। राइट? तो यह जो प्रोडक्ट था इसके पास अपने नाम और अपना प्राइस था। राइट। और फिर हमने कहा था कि हमारे पास है एक कार्ड जिसके पास अपना एक ही मेथड है जो कि है अ कैलकुलेट प्राइस टोटल प्राइस। ठीक है? उसके अलावा हमारे पास दो क्लासेस और थी। एक तो डीबी में पर्सिस्ट करती थी और एक इनवॉइस को प्रिंट करती थी। तो लेट्स से इनवॉइस प्रिंटर क्लास बिल्कुल सेम है। ठीक है? तो जो वो पहले कर रही थी इनवॉइस प्रिंटर वो अभी भी वही कर रही है। ठीक है? अ प्रिंट इनवॉइस और ऐसे ही हमारे पास एक डीबी अ पर्सिस्टेंट क्लास थी या डीबी स्टोरेज क्लास बोल सकते हो आप डीबी स्टोरेज जो कि क्या करती थी? सेव टू डीबी ये मेथड कॉल करती थी। और इनके बीच में रिलेशनशिप ऐसे था कि हैज़ अ हैज़ अ एन कार्ड हैज़ वन टू मेनी प्रोडक्ट। तो ये इनके बीच में रिलेशनशिप था। हमने दोबारा से फटाफट से डायग्राम ड्रॉ किया और कुछ नहीं किया। तो अब देखते हैं कि ओपन क्लोज प्रिंसिपल क्या होता है और कैसे हम उसे फॉलो कर सकते हैं। सबसे पहले देखते हैं प्रॉब्लम कहां आएगी। लेट्स से मैं कह रहा हूं मैं एक नया फीचर इंटीग्रेट करना चाहता हूं इसी कोड में कि अभी तक तो ना हम सिर्फ डेटाबेस के अंदर चीजें स्टोर कर रहे वो भी लेट्स से सीक्वल डेटाबेस के अंदर स्टोर कर रहे थे। अब मुझे सीक्वल के अलावा मोंगो डीबी में भी सेम डेटाबेस स्टोर करना है और लेट्स से एक फाइल में भी सेम डेटाबेस स्टोर करना है। तो मैं कैसे कर सकता हूं? मैं कहूंगा बहुत सिंपल है। डीबी स्टोरेज क्लास तो मेरी बनी हुई है। इसमें फटाफट से जाकर के मैं दो मेथड और लगा सकता हूं। सेव टू डीबी का तो एक मेथड लगा हुआ है। मैं एक काम करता हूं। सेव टू मोंगो करके एक मेथड बना लेता हूं। और सेव टू फाइल करके एक मेथड बना लेता हूं। और इसके अंदर मैं कोड लिख दूंगा डेटाबेस में स्टोर करने का और फाइल में स्टोर करने का। राइट? बिल्कुल गलत। इसकी वजह से मैंने ओपन क्लोज प्रिंसिपल को ब्रेक कर दिया। क्यों? क्योंकि मैंने कोई नए फीचर को इंटीग्रेट करने के लिए जो कि जो कि था डेटा मोंगो डीबी में स्टोर करना और फाइल में स्टोर करना। इस नए फीचर को इंटीग्रेट करने के लिए मैंने अपनी पुरानी बनी बनाई क्लासेस के अंदर जाकर के कोड को चेंज किया। नया मेथड ऐड किया। ये गलत है। तो ओपन क्लोज प्रिंसिपल कहता है आप ये नहीं कर सकते। तो फिर मैं कैसे इंटीग्रेट करूं नया फीचर बिना अपना पुराना कोड चेंज करे। तो उसका तरीका आता है हमारे पास एब्स्ट्रैक्शन से, इनहेरिटेंस से, और पॉलीमॉर्फिज्म से। तो अगर आपने ये तीनों अच्छे से पढ़े थे ऊब्स के लेक्चर में, तो इन तीनों को मिला करके हम ओपन क्लोज़ प्रिंसिपल को बहुत ईज़ीली यूज़ कर पाएंगे। चलो देखते हैं कैसे। ठीक है? एक बार इसे हटा देते हैं। अब चलो अब हमें ओपन क्लोज प्रिंसिपल को फॉलो करना है। बेसिकली हमें क्या करना है? हमारे पास यह जो क्लास थी डेटाबेस स्टोरेज की इसे नहीं छेड़ना बल्कि मल्टीपल नई क्लासेस जो आ रही हैं मल्टीपल नए फीचर्स जो आ रहे हैं उन्हें भी इंटीग्रेट करना है। हम एक काम करते हैं। हम ये जो डीबी स्टोरेज क्लास है ना पहले तो ये अभी एक हार्ड क्लास है। बेसिकली कंक्रीट क्लास है। डायरेक्टली ये डेटाबेस स्टोरेज का मेथड कॉल कर सकती है। इसको सबसे पहले एक एब्स्ट्रैक्ट क्लास बना देते हैं। और ये जितनी भी अलग-अलग फीचर हैं इनको स्पेसिफिक कंक्रीट क्लासेस बनाते हैं। देखो मैं क्या कहना चाहता हूं। व्हाट इफ अगर हम ये करें कि सबसे पहले हम डीबी पर्सिस्टेंस या पर्सिस्टेंस के नाम से स्पेलिंग मिस्टेक है। हां। अगर हम सबसे पहले डीबी पर्सिस्टेंस के नाम से एक क्लास बना दें। ठीक है? और ये हमारी इंटरफ़ेस हो या एब्स्ट्रैक्ट क्लास हो। जिसको हम ऐसे डिनोट करते हैं। अगर आपको याद हो यूएमएल डायग्राम में। तो एक बार थोड़ा सा ओवरव्यू ले लेते हैं। एब्स्ट्रैक्ट क्लासेस तो आपको पता ही है। इसको ना हम नॉर्मल लैंग्वेज में इंटरफेस बोलते हैं। एक इंटरफेस क्या होता है? बेसिकली इंटरफेस कुछ नहीं होता। एक कॉन्ट्रैक्ट होता है एक एप्लीकेशन बेसिकली यानी कि एक क्लास में और एक क्लाइंट के बीच में। ठीक है? तो एक बार ध्यान से इसको समझ लो। फिर इस पे आते हैं क्योंकि ये बहुत जरूरी है। ठीक है? तो लेट्स सपोज़ आपके पास एक क्लाइंट है। अच्छा क्लाइंट कौन होता है? क्लाइंट कोई भी सॉफ्टवेयर, एप्लीकेशन, यूजर कोई भी हो सकता है जो हमारी एक क्लास को यूज कर रहा है। ठीक है? और यहां हमारी एक क्लास है। ये क्लास कंक्रीट क्लास है। कंक्रीट क्लास मतलब इसके सारे मेथड्स को ये डिफाइन करती है। तो बीच में हम एक इंटरफेस बना लेते हैं। इंटर फेस बेसिकली ये हम बना लेते हैं बीच में। ये इंटरफेस क्या करता है? एक कॉन्ट्रैक्ट का काम करता है जो इस क्लाइंट को बताता है कि ये जो क्लास है ये क्या करती है? बिना ये बताए कि उसे वो कैसे करती है। अगर आपको याद होगा हमने एब्स्ट्रैक्शन में यही तो पढ़ा था। बेसिकली इंटरफेस को बेसिक C++ में एक्सप्रेस करने के तरीके को ही हम एब्स्ट्रैक्शन कहते हैं। क्योंकि C++ में हमारे पास एब्स्ट्रैक्शन अवेलेबल है। लेकिन जब आप जावा की बात करते हो तो जावा में हम सीधा इंटरफ़ेस के थ्रू ही उसे एक्सप्रेस करते हैं। उसके कीवर्ड का नाम ही इंटरफ़ेस है। जावा में इंटरफ़ेस है, C++ में एब्स्ट्रैक्ट है। एब्स्ट्रैक्ट क्लास है। तो क्या करते हैं हम इंटरफ़ेस में? या एब्स्ट्रैक्ट क्लास में C++ में हम वो सारे मेथड्स को वर्चुअल बना देते हैं। यानी कि सिर्फ डिक्लेअर करते हैं। उसे डिफाइन नहीं करते। बस ये बताते हैं कि वो क्लास जिस जो इसे बेसिकली इस इंटरफ़ेस को जो इन्हेरिट करेगी वो क्या-क्या कर सकती है बिना ये बताएं कि वो उसे कैसे करेगी। तो ये कॉन्ट्रैक्ट का काम करता है। राइट? एक क्लाइंट और क्लास के बीच में। आप इतना समझ गए? तब आपको समझ आ जाएगा कि हम एब्स्ट्रैक्ट क्लास क्यों बनाते हैं। क्योंकि जब हम पॉलीमॉर्फिज्म का यूज करते हैं। यानी कि अगर हम एक एब्स्ट्रैक्ट क्लास बना दें और a लेट से और बहुत सारी कंक्रीट क्लास बनाएं a1, a2, a3 जो इस एब्स्ट्रैक्ट क्लास को इन्हहेरिट करती हो। ठीक है? तो अगर इस एब्स्ट्रैक्ट क्लास में एक फंक्शन होगा लेट्स से m1 एक फंक्शन होगा तो वो इन सब में m1 होगा। इन सब में भी होगा। राइट? इन सब में वो फंक्शन होगा। और ये सारे उस फंक्शन का एक डेफिनेशन देते होंगे क्योंकि इसने तो बस इस फंक्शन को डिक्लेअ किया होगा। राइट? तो ये सारे मिलके उस फंक्शन की एक डेफिनेशन देते होंगे। और ये तीनों डेफिनेशंस अलग हो सकती हैं। बस डिपेंड करता है जब भी हम इसका ऑब्जेक्ट बनाएंगे। हम कैसे ऑब्जेक्ट बनाएंगे? लेट्स से हम एक का एक ऑब्जेक्ट बनाएंगे। लेट्स से a = न्यू। अब उस न्यू में हम कुछ भी स्टोर कर सकते हैं। A1 स्टोर कर सकते हैं, A2 स्टोर कर सकते हैं या A3 स्टोर कर सकते हैं। क्योंकि अगेन हम चाइल्ड क्लास के ऑब्जेक्ट को पेरेंट क्लास के रेफरेंस को असाइन करवा सकते हैं पॉलीमॉर्फिज्म के जरिए। इसी को मेथड ओवराइडिंग बोलते हैं। और एक बार हमने ये किया तो अगर हमने न्यू A1 किया होगा तो M1 A1 का कॉल होगा। अगर हमने न्यू A2 कॉल हो किया होगा तो ये जो M1 मेथड है वो A2 के अंदर का कॉल होगा। और सेम अगर A3 किया होगा तो M1 मेथड A3 के अंदर का कॉल हुआ होगा। ये एक थोड़ा सा ओवरव्यू था। शायद आप ये लोग समझते ही होंगे। इसी को पूरा का पूरा इन्हहेरिटेंस और पॉलीमॉर्फिज्म मिला के यूज़ करते हैं हम। इसी को हम इंटरफसेस बोलते हैं और मेथड ओवराइडिंग यूज़ करता है इंटरफ़ेस। बेसिकली इंटरफ़ेस बहुत ज्यादा मेथड ओवराइडिंग यूज़ करता है ताकि ये सारा का सारा आपको फीचर प्रोवाइड कर सकें। ठीक है? तो चलो वापस चलते हैं अपने प्रॉब्लम की तरफ। हमने क्या कहा था? हमने यही कहा था कि हम एक काम करते हैं। हम यह जो डीवी पर्सिस्टेंस की क्लास थी इसे एक एब्स्ट्रैक्ट क्लास बना लेते हैं। क्योंकि ऊपर हमारा क्या चल रहा था? ये जो हमने क्लास बनाई थी ये एक कंक्रीट क्लास थी। क्योंकि ये सारे के सारे मेथड्स को डिक्लेअर करती थी। और हम ये तो बहुत गलत तरीका था कि हम सारे के सारे मेथड्स इसमें डिफाइन कर दें क्योंकि ओपन क्लोज प्रिंसिपल को ब्रेक कर रहा था। तो हमने एक एब्स्ट्रैक्ट क्लास बना दी डीबी पर्सिस्टेंस। और हमने क्या किया? जितनी भी हमारे अ पर्सिस्ट करने के तरीके हैं जो हमारे फीचर्स हैं फॉर एग्जांपल एक है अ सेव टू सीक्वल डीबी जो पहले से बना हुआ था राइट अब ये हमने एक अलग क्लास बना दी ऐसे ही एक हमारे पास अब आ गया नया फीचर सेव टू मोंगो डीबी लेट्स से तो इसकी हमने एक अलग क्लास बना दी ऐसे ही हमारे पास आ गया सेव टू फाइल और इसकी हमने सेम दोबारा से एक अलग क्लास बना दी और हमने कहा ये जो तीनों क्लास हैं ये इसे इन्हहेरिट करती हैं। तो ये इन्हहेरिटेंस हो गया। देखा एरो बनाते हैं इन्हहेरिटेंस के लिए। तो ये तीनों क्लास इन्हहेरिट करती हैं। मतलब तीनों की तीनों पर्सिस्टेंस लॉजिक को इन्हहेरिट करती हैं। तो अगर पर्सिस्टेंस डीवी पर्सिस्टेंस में एक फंक्शन है सेव जो कि सिर्फ डिक्लेअ है। तो इन तीनों में भी ये फंक्शन होगा सेव जिसे ये डिफाइन करेंगे। इसमें भी फंक्शन होगा सेव जिसे ये डिफाइन करेगा। सेव जिसे ये डिफाइन करेगा। और वहीं जैसे अभी हमने नीचे बात की थी सेव टू डेटाबेस। सीक्वल डेटाबेस के अंदर जो सेव फंक्शन होगा वो सारी की सारी वो प्रॉब्लम हैंडल करेगा कि हमें सीक्वल डेटाबेस के अंदर चीजों को कैसे स्टोर करना होता है। सेम सेव टू मोंगो डीबीबी के अंदर जो सेव मेथड होगा वो सारी की सारी वो प्रॉब्लम हैंडल करेगा कि हमें मोंगो डीबी में डेटाबेस को कैसे स्टोर करना होता है। सॉरी मोंगो डीबी में हमें चीजों को कैसे स्टोर करना होता है। और सेम सेव टू फाइल सेव फंक्शन उस तरह इंटीग्रेट करेगा कि हमें फाइल में कैसे स्टोर करना होता है। तो लेट्स से ये कुछ क्वेरी लगाएगा। राइट? यह कुछ मेथड्स कॉल करेगा मोंगो डीबी के और सेव टू फाइल फाइल इनपुट आउटपुट पे काम करेगा। बट इन सबका सेव अलग होगा पर सेम एक ही मेथड होगा सेव। तो ये मेथड ओवराइडिंग के थ्रू हम इसमें ये चीज कर सकते हैं। अब मैंने इनकी अलग-अलग क्लासेस बना दी। अब बाकी चीज़ बिल्कुल सेम रखते हैं। अब हम क्या करते हैं? लेट्स से यहां पे हमारी जो कार्ट क्लास थी वो हम यहां बना लेते हैं। ये रही हमारी एक कार्ट क्लास। ठीक है? और क्ल कार्ट क्लास में क्या था? यह जो डीबी पर्सिस्टेंस था इसके पास हैज़ अ रिलेशनशिप था कार्ट का। जैसे हमने यहां देखा था यह यहां हमने देखा था कि डीबी स्टोरेज के पास एक हैज़ अ रिलेशनशिप था कार्ट का। ठीक है? तो हमने यहां बना लिया। यानी कि अब सब कुछ बाकी चीज़ सेम रही। बस हमने क्या किया? हमने इंट्रोड्यूस कर दिया एक नए एब्स्ट्रैक्शंस को व्हिच इज़ डीबी पर्सिस्टेंस। अब जो कार्ट है वो डीबी पर्सिस्टेंस से बात करता है। यानी कि सॉरी उल्टा बोलना चाहिए। डीबी पर्सिस्टेंस जो है वो जो कार्ट के मेथड को कॉल करता है सेव। वो उसको इंटीग्रेट करने के अब अलग-अलग तरीके हैं। उसको मेथड ओवराइड करने के अब अलग-अलग तरीके हैं। अब अगर आपको डेटाबेस में स्टोर करना है हमारे पास अलग क्लास है। अगर आपको मोंगोडी में स्टोर करना है अलग क्लास है और फाइल में स्टोर करना है तो अलग क्लास है। तो यहां पे हमने ओपन क्लोज प्रिंसिपल को सॉल्व कर दिया। कैसे? अब जब भी एक नया फीचर आया जैसे मोंगोडी का आया। हमने एक अलग क्लास बनाई। इस क्लास को छेड़ा ही नहीं। ना ही इस क्लास को छेड़ा जो पहले से बनी हुई थी। सेव टू फाइल का आया। हमने एक अलग क्लास बनाई। पुरानी पुरानी क्लासेस को किसी को भी हमने नहीं छेड़ा। अब लेट्स से कल को एक नया पर्सिस्टेंस आ जाता है कि हमें मोंगो डीबी में सीक्वल में तो कर ही रहे हैं। एक कसांड्रा डीबी है उसमें भी हमें स्टोर करना है एग्जांपल के लिए। ठीक है? तो हम दोबारा वही करेंगे जो अभी तक हम करते आ रहे थे। अब तो बहुत ईजी है। हम क्या करेंगे? एक नई क्लास बनाएंगे और उसे इन्हहेरिट करवा लेंगे इस पेरेंट क्लास से और सारा का सारा सेव का कोड यहां लिख देंगे। ठीक है? तो पुरानी कोड को हमें छेड़ना ही नहीं पड़ रहा। क्यों? क्योंकि बस हमने एक लेवल पे एब्स्ट्रैक्शन इंट्रोड्यूस कर दिया। और अब इस एब्स्ट्रैक्शन में एक ही मेथड है सेव। अब जब भी आप कार्ड जब भी इसको बेसिकली हम जब भी सेव मेथड कॉल करेंगे तो जो भी हमने न्यू ऑपरेटर पे सेलेक्ट किया होगा जब भी हमने इसका ऑब्जेक्ट बनाया होगा डीबी पर्सिस्टेंस का ये तो एब्स्ट्रैक्ट क्लास है। इसका तो ऑब्जेक्ट बन नहीं सकता। तो आप ऐसे ही बनाओगे डीबी पर्सिस्टेंस। लेट्स से एक ऑब्जेक्ट का नाम है डीबी इक्वल टू न्यू। तो उस न्यू के आगे आप जो भी लिखोगे सेव टू सीक्वल डीबी लिखोगे, सेव टू मोंगो डीबी लिखोगे, सेव टू फाइल लिखोगे या जो भी सेव टू कज़्रा लिखोगे डिपेंडिंग अपॉन दैट उसका सेव फंक्शन कॉल हो जाएगा। ठीक है? तो यही था ओपन क्लोज प्रिंसिपल जिसको हमने फॉलो करवा दिया। चलो अब चलते हैं कोड की तरफ। तो ये रहा कोड आपकी स्क्रीन पे। देखते हैं। सबसे पहले तो हमने देखो वही प्रोडक्ट क्लास बनाई जो पहले बनाया था। उसके पास उसका नाम था, प्राइस था और इसका कंस्ट्रक्टर था। फिर हमारे पास एक शॉपिंग कार्ड की क्लास थी। याद है? जिसमें हमारे पास मल्टीपल प्रोडक्ट्स थे और उसमें हमने इसके गेटर सेटर था ऐड प्रोडक्ट और गेट प्रोडक्ट्स और उसमें एक ही फंक्शन था कैलकुलेट टोटल प्राइस। राइट? उसके अलावा हमने दो अलग-अलग क्लासेस बना रखी थी। एक शॉपिंग कार्ड प्रिंटर जो कि सिर्फ प्रिंटिंग इनवॉइस के लिए रिस्पांसिबल थी। उसके पास शॉपिंग कार्ड का एक रेफरेंस था और वो प्रिंट करती थी इनवॉइस को। राइट? उसके अलावा हमारे पास शॉपिंग कार्ड स्टोरेज की फाइल थी क्लास थी जिसके अंदर भी रेफरेंस था और वो डेटाबेस के अंदर चीजों को स्टोर करती थी। अब जैसे कि मैंने कहा मैंने दो नए फीचर को इंटीग्रेट कर दिया। तो सेम क्लास में सेव कर दिया। तो एक तो हो गया सेव टू सीक्वल डेटाबेस, एक सेव टू मोंगो डेटाबेस और सेव टू फाइल जैसे हमने बात की। पर ये एक ओपन क्लोज प्रिंसिपल को ब्रेक कर रहा है। तो ये कोड है ओपन क्लोज प्रिंसिपल को ब्रेक करते हुए दिखाने का। ठीक है? तो अब देखो आप देख सकते हो मेन हमने क्या किया? वही कार्ड का एक ऑब्जेक्ट बनाया। कार्ड में दो आइटम को ऐड किया। लैपटॉप और माउस। फिर हमने शॉपिंग कार्ड प्रिंटर का भी ऑब्जेक्ट बनाया जिसमें कार्ड को पास कर दिया और प्रिंटर से प्रिंट इनवॉइस कॉल करवा दिया। प्रिंटर क्या था? प्रिंटर शॉपिंग कार्ड प्रिंटर का ऑब्जेक्ट था जिसमें हमने प्रिंट इनवॉइस कॉल करवा दिया। बिल्कुल सही है। सेम तरीके से हमने स्टोरेज का ऑब्जेक्ट बनाया डीबी और उसका एक शॉपिंग कार्ड स्टोरेज बना दिया। उसको कार्ड को पास करवा दिया। और अगेन हमने इसका एक मेथड कॉल करा दिया व्हि इज़ सेव टू सीक्वल डेटाबेस। हम इसकी जगह सेव टू मोंगो डेटाबेस या सेव टू फाइल भी कॉल करा सकते थे। इस अगर कोड को हम फटाफट से रन करके देख लें। तो आप 1 सेकंड तो हां। तो सबसे पहले हमने देखा कि हमारा इनवॉइस प्रिंट हो गया और उसके बाद हमारा सेव टू सीक्वल डेटाबेस प्रिंट हो गया। तो पर ये तो ओपन क्लोज प्रिंसिपल को ब्रेक कर रहा है। जैसे हमने बोला क्यों ब्रेक कर रहा है? क्योंकि इसमें सारे के सारे मेथड्स मैंने यहां पे एक साथ डिक्लेअर कर दिए। तो वो कोड देखते हैं जिसमें हमने इसको सॉल्व किया। जैसे हमने बात की थी एब्स्ट्रैक्शन इंट्रोड्यूस करके। तो ये है हमारा दूसरा कोड जिसमें हमने उसी प्रॉब्लम को सॉल्व किया। तो सेम है। ये तो प्रोडक्ट है, शॉपिंग कार्ड है। इसमें सब कुछ सेम रहेगा। अब देखो ये भी प्रिंटर क्लास है। ये भी बिल्कुल सेम रहेगी। चेंज हुआ इसमें देखो यहां से। ओके? तो सबसे पहले तो हमने एक एब्स्ट्रैक्ट क्लास बनाई पर्सिस्टेंस के नाम से। ठीक है? और हमने तीन सब क्लासेस बनाई सीक्वल पर्सिस्टेंस, मोंगो पर्सिस्टेंस, फाइल पर्सिस्टेंस जो इस एब्स्ट्रैक्ट क्लास पर्सिस्टेंस को इन्हहेरिट करती है। अब इस एब्स्ट्रैक्ट क्लास के अगर अंदर जाएं तो क्या है? कुछ नहीं है। सेम है। बिल्कुल कार्ड का एक रेफरेंस है और एक ही वर्चुअल मेथड है सेव। ठीक है? अब यहां पे हमें कार्ड का रेफरेंस लेने की जरूरत नहीं है क्योंकि हमने इसमें इसमें मेथड लिया हुआ है कार्ड। ठीक है? तो इसमें एक ही मेथड है सेव। ठीक है? प्योर वर्चुअल फंक्शन है। अब ये सीक्वल, मोंगो और फाइल पर्सिस्टेंस तीनों इसको ओवराइड करते हैं। ओके? सॉरी हम इसको यहां पे भी डाल देते हैं। ठीक है? तो तीनों इसको यहां पे ओवराइड करते हैं। देखो सेव, सेव और सेव। और तीनों के पास एक अपना लॉजिक है। तो सीक्वल पर्सिस्टेंस सेव करता है सीक्वल डेटाबेस में। मोंगो मोंगो में सेव करता है और फाइल फाइल में सेव करता है। तो ये हमारा कोड हो गया पूरा का पूरा ओपन क्लोज प्रिंसिपल को फॉलो करते हुए। तो अगर मेन क्लास देखोगे तो बिल्कुल सेम है। हमने पहले कार्ड बनाए। दो आइटम्स को ऐड किए। प्रिंटर से हमने इनवॉइस को प्रिंट किया। फिर हमने तीन अलग-अलग वेरिएबल बनाए रेफरेंसेस बनाए पर्सिस्टेंस के। एक डेटाबेस में, सीक्वल में स्टोर कराने के लिए, एक मोंगो में और एक फाइल में स्टोर कराने के लिए। और तीनों पे सेव फंक्शन कॉल कर दिया। अब देखो तीनों पे सेव फंक्शन कॉल तो करा पर तीनों पे सेव फंक्शन काम करेगा अलग-अलग तरीके से। तो ये देखो पहले तो हमने इनवॉइस प्रिंट किया। फिर देखो सेविंग, शॉपिंग कार्ड टू सीक्वल, शॉपिंग कार्ड टू मंगो, शॉपिंग कार्ड टू फाइल। फंक्शन सेम था पर प्रिंट अलग-अलग हुआ क्योंकि मेथड ओवराइडिंग की वजह से। तो यही है ओपन क्लोज प्रिंसिपल। अब हम डिस्कस करते हैं अपने अगले प्रिंसिपल को जिसे हम कहते हैं लिस्क ऑफ सब्स्टट्यूशन प्रिंसिपल। चलो आ जाओ स्क्रीन पे। तो अब हम जंप करते हैं अपने नेक्स्ट डिजाइन प्रिंसिपल की तरफ जो कि है लिस ऑफ सब्स्टट्यूशन प्रिंसिपल। ठीक है? अब देखते हैं यह क्या कहता है? तो एल स्टैंड्स फॉर लिसकॉफ सब्स्टट्यूशन प्रिंसिपल। यहां पे लिस्कॉफ कौन है? लिस्कॉफ वो बंदा है जिसने ये प्रिंसिपल दिया था। ठीक है? तो फटाफट से इसकी डेफिनेशन देखते हैं। तो ये है इसकी डेफिनेशन। सब क्लासेस शुड बी सब्स्टट्यूटेबल फॉर देयर बेस क्लासेस। क्या मतलब है इस लाइन का? देखो ये लाइन अभी जब मैं आपको समझाऊंगा तो आपको लगेगा ये तो ऑलरेडी हमें पता है। इसी को तो इन्हहेरिटेंस बोलते हैं और ये तो बहुत ही बेसिक प्रॉपर्टी है। बट आपको जान के हैरानी होगी ये इतनी बेसिक प्रॉपर्टी है। बट स्टिल सबसे ज्यादा इसको ब्रेक किया जाता है जब हम रियल लाइफ प्रोजेक्ट बनाते हैं। जानबूझ के ब्रेक नहीं किया जाता पर ये ब्रेक हो जाता है। क्योंकि हम सारे इसके जो रूल्स हैं वो दिमाग में नहीं रख पाते। अभी वो क्या हैं? कैसे नहीं रख पाते? अब आपको समझ आएगा। एक बार इसको समझ लेते हैं। चलो। तो मैंने कहा सब क्लासेस शुड बी सब्स्टट्यूटेबल फॉर द बेस क्लासेस। अब इसका क्या मतलब? इसको समझते हैं। चलो सपोज़ करो आपके पास एक क्लास है A। ठीक है? और एक क्लास है B। तो ये जो B क्लास है ना ये लेट्स से इन्हहेरिट करती है A क्लास को। तो ठीक है? तो हमारी जो A क्लास हो गई वो हो गई हमारी अ बेस क्लास। और हमारी जो B हो गई वो हो गई हमारी सब क्लास। राइट? ठीक है? या पेरेंट क्लास या चाइल्ड क्लास बोल लो। अब लिसको सब्सीट्यूशन प्रिंसिपल ये कहता है कि कोई भी ऐसा क्लाइंट कोई भी ऐसा क्लाइंट जो किसी मेथड में A को एक्सपेक्ट कर रहा हो। यानी कि ऐसा कोई मेथड कॉल हो जहां पे आपको ए क्लास ए बेस क्लास के रेफरेंस को पास करना हो और अगर मैं उसकी जगह बी क्लास के रेफरेंस को पास कर दूं तो भी कोई दिक्कत ना हो तब भी कोड ना फटे हर चीज बिल्कुल एज़ इट इज़ चलनी चाहिए। इसका मतलब क्या हुआ? इसका मतलब ये हुआ कि बेस क्लास बेसिकली कोई भी सब क्लास सब्सीट्यूटेबल है बेस क्लास के लिए। मतलब जहां भी मैं बेस क्लास को डाल सकता हूं मैं वहीं पे अपनी चाइल्ड क्लास को भी डाल सकता हूं। तो यही तो इन्हहेरिटेंस भी कहता था। इन्हहेरिटेंस कहता था कि हमारी एक बेस क्लास है और हमारी एक सब क्लास है। तो जो हमारी सब क्लास है वो बेस क्लास के फीचर्स को हमेशा एक्सपेंड करें। कभी भी उसको नैरो ना करें। राइट? याद है हमने डिस्कस किया था कि हमारे पास जो ये a हमारी क्या कहते हैं? बेस क्लास है इस पे कुछ मेथड्स होंगे। लेट से इस पे मेथड होगा m1, m2 और m3। इसके पास तीन मेथड्स हैं। तो मैं कह रहा था ये जो B है इसके पास भी ये सेम मेथड आ जाएंगे अपने आप M1, M2 एंड M3 क्योंकि ये इसको इन्हहेरिट करती है। पर इसके पास इस M1, M2, M3 के अलावा अपने भी खुद के कुछ मेथड होंगे। लेट्स से इसको हम बोलते हैं M4 और M5। ये अपने उसके खुद के स्पेशलाइज़्ड मेथड हैं। तो इसने क्या किया? इसने A को एक्सपेंड कर दिया। यानी कि A में बेसिकली A B ने क्या किया? A की फंक्शनैलिटीज़ को और एक्सटेंड कर दिया। राइट? कभी भी उसको कॉन्ट्रैक्ट नहीं किया, कभी भी उसको नैरो डाउन नहीं किया। तो यही लिस्ट ऑफ सब्स्टट्यूशन प्रिंसिपल कहता है। ऐसा ही होना चाहिए कि कहीं भी हम जहां पे पेरेंट क्लास का ऑब्जेक्ट भेज सकते हैं, वहां अगर हम चाइल्ड का भेज दें तो कोई दिक्कत ना हो। क्यों दिक्कत ना हो? अभी जैसे हमने समझा एक बार और समझते हैं थोड़ा सा ध्यान से। तो लेट्स से हमारे पास एक A है और हमारे पास B है। तो जो B है वो इन्हहेरिट करता है A से। अब A के पास कुछ मेथड हैं। M1 है, M2 है और M3 है। ठीक है? सेम B के पास भी वो मेथड अपने आप आ जाएंगे। बाय इन्हहेरिटेंस M1 आ जाएगा, M2 आ जाएगा और M3 आ जाएगा। ठीक है? और मैंने कहा B के पास अपने खुद के M4 और M5 भी है जो वो उसने खुद के लिए बना रखे हैं। ये इसके स्पेशलाइज्ड मेथड हैं। तो अब कोई भी क्लाइंट लेट्स से यहां पे हमारे पास है एक क्लाइंट जो A से बात करता है। बात करने का मतलब क्या हुआ? बेसिकली क्लाइंट के पास कोई मेथड है जिसमें मैं ए को पास करता हूं। ठीक है? तो लेट से कोई भी मेथड हो सकता है वह। मैं उसको बोलता हूं एक रैंडम मेथड। जिसमें मैं A के एक पॉइंटर को एक्सपेक्ट करता हूं। यह देखो। ठीक है? A के एक रेफरेंस को एक्सपेक्ट करता हूं। तो अब अगर मैं A को एक्सपेक्ट कर रहा हूं तो क्लाइंट क्या करता होगा? अगर मैं A को एक्सपेक्ट कर रहा हूं तो क्लाइंट क्या करेगा? उस A के मेथड्स को कॉल करेगा। तो वो उस रेफरेंस से m1 को कॉल कर सकता है। वो यहां पे लिख सकता है। ये जो हमारे पास a का रेफरेंस आया है वो यहां पे लिख सकता है। इस रेफरेंस से a डॉट m1 ऐसे कॉल कर सकता है या फिर वो m2 को कॉल कर सकता है या फिर वो m3 को कॉल कर सकता है। बस यही तीन मेथड कॉल कर सकता है वो m1, m2 और m3। राइट? तो मैंने वही कहा कि जब क्लाइंट A से बात कर रहा होगा यानी कि A का रेफरेंस हमने यहां पास किया होगा तो वो M1, M2, M3 को कॉल कर पाएगा। पर मैं कह रहा हूं लिस्क ऑफ सब्स्टट्यूशन प्रिंसिपल या एलएसपी ये कहता है कि ये जो हमारा सब क्लास है B इसको अगर मैं यहां भेज दूं तो क्या होगा? तो यहां पे बेसिकली इसको असाइन हो जाएगा। तो कोड ऐसे बन जाएगा। a स्टार = न्यू b अगर मैंने यहां पर b को भेज दिया तो ऐसा हो जाएगा तब भी तो मैं m1 m2 m3 को कॉल कर सकता हूं तो तब भी मैं इस वेरिएबल a से अगर मैं m1 कॉल करूंगा m2 कॉल करूंगा और m3 कॉल करूंगा तो भी ये चलेगा राइट क्योंकि m1 m2 m3 तो यहां पे भी है इन्हहेरिटेंस है वो इधर भी आ गए तो मुझे उसको बी में डिक्लेअर करने की जरूरत ही नहीं है अगर यहां पे डिक्लअर करने की सिर्फ तभी जरूरत होती। अगर यहां पे ये सिर्फ डिक्लेअ होते सॉरी डिफाइन करने की जरूरत सिर्फ तभी होती अगर यहां पे ये सिर्फ डिक्लेअर होते m1 m2 m3 और मुझे यहां पे ना डिफाइन करना पड़ता। तो बेसिकली वहां पे वो वर्चुअल फंक्शन होते। बट लेट्स से वो वो वो वो वो वो वो वो वो वो वर्चुअल फंक्शन नहीं है। वो नॉर्मल फंक्शन है। तो ये ऑलरेडी a ने डिफाइन कर दिए। b को डिफाइन करने की जरूरत ही नहीं है। तो ये तो होना ही है। राइट? बल्कि मैं जो क्लाइंट है उसको तो कभी पता ही नहीं था ना m4 और m5 फंक्शनंस के बारे में। ये तो स्पेसिफिक टू b है। राइट? तो वो उन्हें कभी कॉल भी नहीं करता था। तो वो अभी भी कॉल नहीं करेगा। तो सारी चीजें एज इट इज़ वर्क करनी चाहिए। इतना सिंपल है ये लिस ऑफ सब्स्टट्यूशन प्रिंसिपल। बट हैरानी की बात ये है जितना ये सिंपल लग रहा है उतना ज्यादा इसको ब्रेक किया जाता है। उतना ज्यादा ये ब्रेक हो जाता है। क्यों? अभी इसको डिस्कस करते हैं। पहले इसका एक एग्जांपल देखेंगे लिस्ट ऑफ सब्स्टट्यूशन प्रिंसिपल का कि कहां पे ये यूज़ होता है और कैसे ये ब्रेक होता है और फिर उसको हम कैसे सॉल्व कर सकते हैं। तो आई होप आपको ये तो समझ आया होगा। चलो अब एक एग्जांपल की तरफ जंप करते हैं। ठीक है? अब ना आप इमेजिन करो। अब अगेन मैं यूएमएल डायग्राम से स्टार्ट करेंगे। ठीक है? हमारे पास एक क्लास है अकाउंट की। ठीक है? ये बैंक अकाउंट वाला अकाउंट है। तो हमारे पास एक अकाउंट की क्लास है। ठीक है? और मैं कह रहा हूं हर अकाउंट में दो फीचर तो होने ही चाहिए जो कि है डिपॉजिट और विथड्रॉ। यानी कि मैं कैश को डिपॉजिट कर सकता हूं और कैश को विथड्रॉ कर सकता हूं। लेट्स से ये जो अकाउंट है ये हमारे पास अगेन एक एब्स्ट्रैक्ट मेथड है। ऐसे लिख देते हैं हम। ठीक है? यानी कि इसको ये डिफाइन नहीं करता। सिर्फ डिक्लेअ करके छोड़ देता है और जो भी इसकी चाइल्ड क्लास होंगी जो भी इसको इनहेरिट करेंगे उसे डिफाइन कर देंगे। ठीक है? अब मैं क्योंकि एक एप्लीकेशन बना रहा हूं बैंकिंग सिस्टम से रिलेटेड। तो मैंने अकाउंट क्लास बना ली। एब्स्टैक्ट क्लास बना ली। फिर मेरे को क्या लगा कि रियल इसकी कंक्रीट क्लासेस क्या-क्या हो सकती हैं? तो मैंने सबसे पहले एक बनाया सेविंग्स अकाउंट। एक बना लिया मैंने लेट्स से करंट अकाउंट। ऐसे ही लेट्स से एक सैलरी अकाउंट भी हो सकते हैं। राइट? ऐसे बेसिकली अलग-अलग तरीके के अकाउंट हो सकते हैं। अभी हम चलो दो ही देखते हैं। सेविंग्स अकाउंट और करंट अकाउंट। ठीक है? तो ये हमारे पास दो क्लासेस हो गई। सेम ये भी एक क्लास है। और ये दोनों क्या कर रही हैं? इसको इन्हहेरिट कर रही हैं। राइट? तो अगर इन्हहेरिट कर रही हैं तो इनके पास भी दोनों फंक्शन आ जाएंगे। इसके पास भी डिपॉजिट होगा। इसके पास भी विथड्रॉ होगा और इनको ओवराइड करना पड़ेगा इन मेथड्स को। राइट? इसको भी डिपॉजिट को ओवराइड करना पड़ेगा और विथड्रॉ को ओवराइड करना पड़ेगा। तो ये हमारा एक सिनेरियो हो गया। ठीक है? बिल्कुल सही बात है। आप भी सोचोगे यही तो होनी चाहिए हायरार्की कि एक अकाउंट है सेविंग्स अकाउंट और करंट अकाउंट दोनों एक तरह के अकाउंट ही तो हैं। तो इनका इज अ रिलेशनशिप है। इनहेरिटेंस रिलेशनशिप है। तो हम क्या कह सकते हैं? सेविंग्स अकाउंट इज़ अ अकाउंट। या वैसे ही सेम करंट अकाउंट इज़ ए अकाउंट। बिल्कुल सही चल रहा है। ठीक है? तो अब लेट्स से अगेन हमारे पास एक क्लाइंट है। क्लाइंट हमेशा इंटरेक्ट किससे करता है? इंटरफ़ेस से। तो क्लाइंट हमेशा इंटरफ़ेस से इंटक्ट करता है क्योंकि उसको उसी के बारे में पता है। याद है हमने अभी डिस्कस किया था इंटरफ़ेस एक कॉन्ट्रैक्ट का काम करता है और क्लाइंट कोई भी हो सकता है। यूजर हो सकता है, कोई भी सॉफ्टवेयर हो सकता है, कोई एप्लीकेशन हो सकती है। कोई भी जो हमारी क्लास से हमारी इंटरफ़ेस इंटैक्ट करता है। ठीक है? अब क्लाइंट को इतनी नॉलेज है कि मैं डिपॉजिट और विथड्रॉ कॉल कर सकता हूं। तो लेट्स से मैं क्लाइंट की भी एक प्रॉपर क्लास ही बना लेता हूं। तो हमारे पास एक क्लाइंट क्लास है। ये हमारे पास क्लाइंट क्लास हो गई। ठीक है? और क्लाइंट के पास वन टू मेनी अकाउंट्स हैं। ठीक है? तो अगेन उसके पास एक लिस्ट है। लेट्स से वेक्टर लिस्ट है अकाउंट्स की जैसे हमने बात किया और उन वो सारे अकाउंट्स पे लेट्स से क्लाइंट डिपॉजिट और विथड्रॉ कॉल कर लेता है। अभी तक सब कुछ सही चल रहा था। अब देखो लिस्ट ऑफ सब्स्टट्यूशन प्रिंसिपल ब्रेक कैसे हुआ? मैंने कहा कि जो बैंक है ना उसने एक नया टाइप का अकाउंट ओपन किया है। ठीक है? उसे कहते हैं फिक्स्ड डिपॉजिट अकाउंट। ठीक है? बहुत सही अकाउंट है। उसमें ज्यादा इंटरेस्ट रेट मिलता है। अगर पैसा आप रखते हो तो क्या कहते हैं उसे? हम लेट्स से कहते हैं फिक्स्ड डिपॉजिट। क्या ही लिख रहा हूं मैं दोबारा। उसे हम कहते हैं फिक्स्ड डिपॉजिट अकाउंट। ठीक है? अब इस अकाउंट में आपको इंटरेस्ट तो ज्यादा मिलेगा पर ये तभी मिलेगा अगर इसमें विथड्रॉ ना करो। ये तो आपको पता ही होगा। एफडी की एक वो होती है किसी टाइम पीरियड तक। आप उसमें से अमाउंट को विथड्रॉ नहीं कर सकते हो। उसमें स्टोर ही कर सकते हो, डिपॉजिट कर सकते हो। तो बेसिकली उसमें डिपॉजिट तो अलाउड है पर विथड्रॉ अलाउड नहीं है। पर क्योंकि मैंने सोचा फिक्स्ड डिपॉजिट अकाउंट भी एक तरह का अकाउंट है। तो इसे भी मैं इन्हहेरिट करा देता हूं। ठीक है? तो अगर मैं इसे इन्हहेरिट कराऊंगा तो इसको भी डिपॉजिट और विथड्रॉ दोनों को डिफाइन करना पड़ेगा, ओवराइड करना पड़ेगा। अब ये डिपॉजिट को तो ओवराइड ईजीली कर देगा। ठीक है? डिपॉजिट को तो ओवराइड कर देगा। पर ये विथड्रॉ को ओवराइड कैसे करेगा? विथड्रॉ तो ये कर ही नहीं सकता। तो हम जनरली क्या करते हैं? रियल लाइफ एप्लीकेशन में अगर ये विथड्रॉ को ओवराइड नहीं कर सकता तो हम एक काम करते हैं विथड्रॉ को ओवराइड कराते हुए यहां पे रिटर्न करा देंगे एक एक्सेप्शन को या फिर सॉरी हम सिंपल एक एक्सेप्शन थ्रो करा देंगे। तो हम लिख देंगे सिंपल थ्रो कोई कोई सी टाइप की एक्सेप्शन वो हम देख लेंगे कोड में। अभी हम थ्रो कर देते हैं एक्सेप्शन। हमने कोई एक्सेप्शन थ्रो करवा दी। ठीक है? तो हमें लगा अब काम हो गया हमारा। इसका विथड्रॉ कॉल करोगे एक्सेप्शन आ जाएगी। डिपॉज़िट कॉल कर ही सकते हो। अब दिक्कत कहां आई? दिक्कत यहां आई कि जो क्लाइंट था उसको तो पता था कि मेरे पास ये जितने भी अकाउंट्स की लिस्ट है ये जो अकाउंट्स की लिस्ट है इस पे मैं डिपॉजिट और विथड्रॉ दोनों कॉल कर सकता हूं। अगर गलती से वो जो अकाउंट है वो फिक्स्ड डिपॉजिट अकाउंट हुआ क्लाइंट के पास और उसने उस पे विथड्रॉ कॉल कर दिया तो एक्सेप्शन आ जाएगी। और क्लाइंट को तो इस एक्सेप्शन का पता ही नहीं था। क्लाइंट को तो पता ही नहीं था इस एक्सेप्शन को हैंडल कैसे करना है क्योंकि क्लाइंट अवेयर ही नहीं था इस एक्सेप्शन के बारे में कभी भी। राइट? तो यहां पे लिस्क ऑफ सब्स्टट्यूशन प्रिंसिपल ब्रेक हो गया। कैसे ब्रेक हो गया? क्योंकि लिस्क ऑफ सब्स्टट्यूशन प्रिंसिपल क्या कहता है? कि कोई भी चाइल्ड क्लास सब्स्टट्यूटेबल होनी चाहिए अपनी पेरेंट क्लास के लिए। पर यहां पे जो हमारी फिक्स्ड डिपॉजिट चाइल्ड क्लास है उसे हम पेरेंट क्लास के लिए सब्स्टट्यूट कर नहीं पा रहे। क्योंकि इसमें एक फंक्शन है विथड्रॉ जो ये एग्जीक्यू जो ये बेसिकली ओवराइड ही नहीं कर पा रहा क्योंकि यहां पे वो फंक्शन ऐसे ओवराइड करना पड़ेगा। तो यहां पे हमारा लिस्क ऑफ सब्स्टट्यूशन प्रिंसिपल ब्रेक हो जाता है। ठीक है? अब इसे सॉल्व कैसे करें? ठीक है? सबसे पहले एक बैड तरीका देखते हैं इसे सॉल्व करने का। और फिर देखेंगे बेटर तरीका क्या है? बेटर क्या? गुड तरीका। वही तरीका इकलौता तरीका है। ये जो बैड तरीका है ये ज्यादातर लोगों के माइंड में स्टार्टिंग में आता है। तो उसको भी एक बार पढ़ के कंप्लीट कर लेते हैं कि भाई ये तरीका नहीं यूज़ करना। तो हमने कहा कि भाई एक बात बताओ ये जो फिक्स्ड डिपॉजिट अकाउंट है इसमें दिक्कत आ रही है ना क्योंकि इसमें विथड्रॉ का फंक्शन में एक्सेप्शन थ्रो हो रही है। ठीक है? पर है तो ये टाइप का अकाउंट ही तो एक काम करते हैं ना ये जो क्लाइंट का कोड है इसमें चेंज कर देते हैं। बेसिकली क्लाइंट क्या कर रहा होगा? ये जो अकाउंट्स की लिस्ट है इसमें लूप कर रहा होगा। तो लेट्स से ये लूप करता होगा इस अकाउंट की लिस्ट में। लेट्स से अकाउंट्स और उस अकाउंट में ये कॉल करता होगा डिपॉजिट को और उसी अकाउंट में ये कॉल करता होगा विथड्रॉ को। कुछ ऐसा-ऐसा करता होगा। तो अब एक काम करते हैं अपन हम क्या करते हैं ना हम इसी कोड को चेंज कर देते हैं। यानी कि हम इसी में कंडीशन लगा देते हैं कि इफ ये जो अकाउंट है ये फिक्स्ड डिपॉजिट वाला अकाउंट है। मतलब टाइप ऑफ अकाउंट है इसका जो फिक्स्ड डिपॉजिट तो उसमें सिर्फ लेट्स से डिपॉजिट कॉल करो। डिपॉजिट कॉल करो सॉरी और अगर एल्स कोई और अकाउंट है तो उसमें डिपॉजिट और विथड्रॉ दोनों कॉल कर सकते हो। है ना? ये अच्छा तरीका लग रहा है सुनने में। हमने क्लाइंट को ही चेंज कर दिया। पर ये बहुत ही बेकार तरीका है। क्यों? क्योंकि अब क्या आपने कर दिया? अब ना आपका जो क्लाइंट है वो टाइटली कपल्ड हो गया आपके इन सारे तरीके के अकाउंट्स से। पर मैंने कहा था क्लाइंट को तो सिर्फ इंटरफ़ेस से बात करनी चाहिए। तो क्लाइंट को बस ये पता होना चाहिए कि इंटरफेस है जो डिपॉजिट और विथड्रॉ करता है। पर मुझे ये नहीं पता होना चाहिए कितने तरह का इंटरफेस हैं। उसमें वो कैसे उसको इंप्लीमेंट करते हैं। तो मुझे क्यों जानना था कि कोई फिक्स्ड डिपॉजिट अकाउंट भी होता है। कोई करंट अकाउंट भी होता है। कोई सेविंग्स अकाउंट। क्लाइंट का काम था बस डिपॉजिट और विथड्रॉ कॉल करना। ठीक है? पर आपने क्या किया? इस कोड को लिखते ही ये जो इफ एल्स लिख दिया। क्लाइंट को टाइटली कपल कर दिया इन तीनों अकाउंट्स के साथ। क्योंकि अब क्लाइंट को जानना पड़ेगा। क्लाइंट शुड बी अवेयर कि ये जो अकाउंट है जो आ रहा है मेरे पास ये जो एसीसी अकाउंट है इस अकाउंट्स की लिस्ट में ये किस तरह का अकाउंट है अगर ये सेविंग्स अकाउंट है तो मैं इसमें दोनों कॉल कर सकता हूं फिक्स्ड डिपॉजिट तो मैं नहीं कर सकता तो क्लाइंट शुड बी अवेयर टाइटली कपल हो गया अब जैसे ही टाइटली कपल हुआ ये ओपन क्लोज प्रिंसिपल को ब्रेक कर देगा कैसे अब देखो सोचो कल को हमें एक और तरह का अकाउंट खोलना पड़ा ठीक है लेट्स से हमने नया तरह का अकाउंट खोला और वो भी इंप्लीमेंट करेगा अकाउंट को उसमें भी कुछ ना कुछ कंडीशन होंगी लेट्स से उसमें विथड्रॉ है, डिपॉजिट नहीं है, कुछ भी ऐसे रैंडम कंडीशन होंगी। फिर मुझे क्लाइंट में जाकर के अगेन कोड चेंज करना पड़ेगा। तो हर बार मुझे क्या करना पड़ रहा है? क्लाइंट की क्लास को जाकर के कोड चेंज करना पड़ रहा है। तो ओपन क्लोज प्रिंसिपल ब्रेक हो गया। हमने लिस्क ऑफ प्रिंसिपल सॉल्व करने गए थे। लिस्क ऑफ सब्स्टट्यूशन प्रिंसिपल सॉल्व करने गए थे। ओपन क्लोज प्रिंसिपल को ही ब्रेक कर दिया। तो इसलिए ये बहुत ही बेकार तरीका है। दूसरा ये टाइटली कपल कर रहा है आपके क्लाइंट को आपकी एप्लीकेशन के साथ जो कि नहीं होना चाहिए। हमने एब्स्ट्रैक्शन का यूज़ ही इसलिए किया था ताकि क्लाइंट सिर्फ उससे बात करें। क्लाइंट को जानने की जरूरत ही नहीं है। कितने तरह के उसके रियल इंप्लीमेंटेशंस हैं। कैसे वो इंप्लीमेंट करती है एंड क्या-क्या करती हैं। ठीक है? तो ये तरीका तो खराब हो गया। और दूसरा तरीका क्या हो सकता है इसको अ इंप्लीमेंट करने का? चलो अब हम वो देखते हैं। ठीक है? तो इसी डायग्राम में देख लेते हैं। ठीक है? इसी डायग्राम में हम चेंजज़ कर लेंगे अपने हिसाब से जो जो हमें चाहिए होगा। ठीक है? पहले हम फालतू की सारी चीजों को हटा देते हैं। तो आपको ये पता ही है एक्सेप्शन थ्रो करेगा। और हम इस पूरे कोड को हटा देते हैं। स्टार्ट। तो यहां पे हमने सारी चीजों को डिलीट कर दिया जो बेकार बेकार चीजें पढ़ी थी। अब देखो हमने क्या किया? हमने कहा कि दिक्कत पता है कहां आ रही है? दिक्कत यहां आ रही है कि ये जो अकाउंट है ना ये जो इंटरफेस है अकाउंट यानी कि एब्स्ट्रैक्ट क्लास है अकाउंट उसमें दो मेथड है डिपॉजिट और विथड्रॉ। पर ये जो फिक्स्ड डिपॉजिट अकाउंट है ये सिर्फ डिपॉजिट यूज़ कर रहा है। विथड्रॉ तो यूज़ ही नहीं कर रहा। तो लॉजिकली ये जो फिक्स्ड डिपॉजिट अकाउंट है ये कभी भी इसका चाइल्ड होना ही नहीं चाहिए था। क्योंकि अगर ये इसका चाइल्ड है तो इसको पेरेंट के सारे मेथड को एग्जैक्टली डिफाइन करना चाहिए। तभी तो वो लिस ऑफ सब्स्टट्यूशन को फॉलो करेगा कि वो बेसिकली क्लाइंट के फीचर को कभी कम नहीं करेगा। उसे हमेशा बढ़ाएगा। पर ये तो नैरो डाउन कर रहा है। क्लाइंट डिपॉजिट और विथड्रॉ दोनों हैंडल कर सकता है। क्लाइंट सॉरी पेरेंट डिपॉजिट और विथड्रॉ दोनों हैंडल कर सकता है। लेकिन क्लाइंट जो हमारा सॉरी चाइल्ड है वो सिर्फ डिपॉजिट हैंडल कर रहा है। तो दिक्कत क्या आ रही है? ये आ रही है कि वो पेरेंट के फीचर्स को कम कर रहा है ना कि उसे बढ़ा रहा है और लॉजिकली उसे बढ़ाना चाहिए क्योंकि वो चाइल्ड है। ठीक है? तो यहां पे ये सूट ही नहीं करता। यहां पे ये होना ही नहीं चाहिए था बेसिकली। तो अब डायग्राम को थोड़ा सा बदलते हैं। हम एक काम करते हैं। हम इस अकाउंट को यहां से हटाते हैं और फिक्स्ड डिपॉजिट अकाउंट को इसका एज अ चाइल्ड हटाते हैं और इसको एक नया इंटरफेस देते हैं एज अ पेरेंट। मतलब हम क्या कहना चाहते हैं? तो चलो देखते हैं। एक काम करते हैं। सबसे पहले एक तो हम रखते हैं नॉन विथड्रोएबल अकाउंट। मतलब ऐसे अकाउंट जिनसे पैसा विड्रॉ नहीं किया जा सकता। ऐसे अकाउंट जिनसे पैसा विड्रॉ नहीं किया जा सकता। तो इसमें एक ही मेथड होगा जो कि होगा डिपॉजिट क्योंकि विथड्रॉ तो आप कर ही नहीं सकते। तो इसमें एक ही मेथड होगा डिपॉजिट और ये भी हमारा एक एब्स्ट्रैक्ट होगा। यानी कि इंटरफेस का काम करेगा। ठीक है? और मैं एक और इंटरफ़ेस बनाता हूं जिसका नाम है विथड्रएबल अकाउंट। तो मैंने दो इंटरफेस बना दिए। एक इंटरफेस को तोड़ के। ठीक है? और ये जो इंटरफ़ेस है ये इस इंटरफ़ेस को एक्सटेंड कर रहा है। ठीक है? पर अच्छा ठीक है। अभी देखते हैं। पर को बाद में सॉल्व करेंगे। ये एक एब्स्ट्रैक्ट क्लास है। ये दूसरी एब्स्ट्रैक्ट क्लास है। ये इसे इंट अ एक्सटेंड कर रहा है। तो ये भी यहां पे मैं लिख देता हूं एब्स्ट्रैक्ट। ठीक है? अब इसे ये अगर एक्सटेंड कर रहा है तो इसमें अगर डिपॉजिट फंक्शन है तो इसमें भी डिपॉजिट अपने आप आ गया। तो वो लिखने की जरूरत ही नहीं है बल्कि एक नया फंक्शन इंट्रोड्यूस करता है व्हिच इज़ विथड्रॉ। ठीक है? तो अब ये हायरार्की हमारी बन के आ गई है। अब सिंपल क्या किया हमने? जो भी विथड्रॉएबल तरह के अकाउंट थे जैसे कि हमारे पास था अ करंट अकाउंट और हमारे पास था सेविंग्स अकाउंट। ये इससे इंट इसको एक्सटेंड करेंगे। ये इसको एक्सटेंड करेंगे। सेम तरीके से हमारे पास जो सेविंग अकाउंट है वो भी इसको एक्सटेंड करेगा। ठीक है? और जो हमारे पास नॉन विथड्रॉएबल अकाउंट है जैसे कि हमारे पास जो है फिक्स्ड डिपॉजिट अकाउंट। तो ये जो फिक्स्ड अ डिपॉजिट अकाउंट है हमारे पास ये डायरेक्टली बात करेगा किससे? नॉन विथड्रॉएबल अकाउंट से। तो ये इसको एक्सटेंड करेगा या इसको इन्हहेरिट करेगा। तो ये सारे इज़ अ रिलेशनशिप्स हैं। ठीक है? तो हमारे पास ये भी इज अ है। ये भी इज अ है। ये भी इज अ और ये भी इज अ सारे इज अ रिलेशनशिप्स हैं यहां पे। ठीक है? अब ये इसको इन्हहेरिट कर रहा है तो इसके पास भी डिपॉजिट का मेथड आ ही जाएगा। बस डिपॉजिट ही आएगा। इसके पास ये इसको कर रहा है और ये लॉजिकली इसको कर रहा है तो इसके पास दोनों आ जाएंगे। एक तो डिपॉजिट भी आ जाएगा और विथड्रॉ भी आ जाएगा। सेम यहां पे भी हो जाएगा। डिपॉजिट भी आ जाएगा और विड्र भी आ जाएगा। तो यह है कहानी पूरी की पूरी। ठीक है? हमने क्या किया यहां पे? जैसे कि एक सिर्फ एक वो था एब्स्ट्रैक्शन था अकाउंट जो तीनों उसी को इंप्लीमेंट कर रहे थे। हमने दो एब्स्ट्रैक्शंस कर दिए दो लेवल पे। दो हायरार्की बना दी बेसिकली। ये हायरार्की बनाई हमने। एक नॉन विथड्रॉएबल अकाउंट, एक विथड्रॉएबल अकाउंट। नॉन विथड्रॉएबल में सिर्फ एक ही मेथड है डिपॉजिट। विथड्रॉबल उसको इनहेरिट करता है। तो डिपॉजिट अपने आप आ गया और इसमें विथड्रॉ डाल दिया और बाकी की कहानी सेम है। ठीक है? अब बस करंट और सेविंग अकाउंट इससे बात करते हैं और फिक्स्ड डिपॉजिट अकाउंट इससे बात करता है। यानी कि फिक्स्ड डिपॉजिट अकाउंट का पेरेंट हमने चेंज कर दिया। अब ये चेंज करने से देखो क्या हुआ? अब ये लिस्ट ऑफ प्रिंसिपल को ढंग से फॉलो करेगा। फॉर एग्जांपल अब जो हमारे पास क्लाइंट होगा। ठीक है? उसके पास दो लिस्ट होंगी। अब पहले क्लाइंट के पास एक ही लिस्ट थी अकाउंट्स की। पर अब क्लाइंट के पास दो तरह की लिस्ट हैं। एक होगी हमारे पास क्लाइंट की नॉन विथड्रॉएबल अकाउंट्स की लिस्ट और एक होगी विथड्रॉएबल अकाउंट्स की लिस्ट। अब नॉन विथड्रॉबल अकाउंट की लिस्ट से ही क्लाइंट को ये बात ऑलरेडी पता है कि इस तरह के अकाउंट में मुझे विथड्रॉ कॉल ही नहीं करना। इसमें क्लाइंट ओपन क्लोज प्रिंसिपल को ब्रेक नहीं कर रहा क्योंकि क्लाइंट टाइटली कपल है ही नहीं। क्लाइंट को बस ये पता है कि मेरे पास दो लिस्ट हैं। एक नॉन विथड्रॉबल अकाउंट, एक विथड्रॉबल अकाउंट और ये इंटरफ़ेस है। मुझे इंटरफ़ेस पता है। ये कहता है सिर्फ डिपॉजिट। सो मैं डिपॉज़िट कॉल करूंगा। ये कहता है विथड्रॉ प्लस डिपॉजिट। िट तो मैं विथड्रॉ प्लस डिपॉजिट कॉल करूंगा। सिंपल क्लाइंट को और कुछ जानने की जरूरत नहीं है। और क्लाइंट सिर्फ इंटरेक्ट करेगा इससे और इससे तो अगर हम ध्यान से देखें तो इसको हम ऐसे ड्रॉ कर सकते हैं कि ये जो हमारी क्लाइंट क्लास है क्लाइंट हैज़ दिस एंड हैज़ दिस। ठीक है? तो यहां पे भी क्लाइंट के पास वन टू मेनी था। तो यहां पे भी क्लाइंट के पास वन टू मेनी ये भी है और वन टू मेनी ये भी है। तो क्लाइंट हैज़ वन टू मेनी नॉन विथड्रॉबल अकाउंट एंड वन टू मेनी विथड्रॉएबल अकाउंट। तो हमारे पास ये पूरा का पूरा यूएमएल डायग्राम यहां बन के आता है। तो यही सब जो हमने पढ़ा इसी को फटाफट से कोड में देखते हैं। चलो। हां जी। तो ये रहा कोड आपकी स्क्रीन पे। फटाफट से देखते हैं जो हमने बात की वही बिल्कुल लिखा हुआ है। तो सबसे पहले तो हम ये करते हैं कि हमने सबसे पहले एक अकाउंट क्लास बनाई। ठीक है? अकाउंट क्लास में दो मेथड रखे हैं। डिपॉजिट और विथड्रॉ दोनों वर्चुअल मेथड हैं। यानी कि ये एक एब्स्ट्रैक्ट क्लास है। इसको इन्हहेरिट करना पड़ेगा और इसको ओवराइड करना पड़ेगा। फिर मैंने तीन तरह के अकाउंट बनाए। सेविंग्स अकाउंट, करंट अकाउंट और फिक्स्ड टर्म अकाउंट। ये वही है जो हमारा एल लिस्ट ऑफ सब्स्टट्यूशन प्रिंसिपल को ब्रेक कर रहा है। तो सेविंग्स अकाउंट जैसे कि मैंने बताया वही है। एक बैलेंस लेता है और डिपॉजिट उसमें डिपॉजिट भी है और विथड्रॉ भी है। डिपॉजिट करने के लिए हम बैलेंस जो भी अमाउंट आया उसमें बैलेंस में ऐड कर देते हैं और प्रिंट कर देते हैं कि डिपॉजिटेड। सेम हम विथड्रॉ में क्या करते हैं? हम एक अमाउंट लेते हैं। चेक करते हैं कि वो नेगेटिव तो नहीं है। अगर नेगेटिव है तो हम बोल देंगे इनसफिशिएंट फंड। मतलब अगर नेगेटिव हो रहा है या पैसा जो हमें विथड्रॉ करना है उससे ज्यादा है जो हमारा बैलेंस है तो हम सीधा प्रिंट कर दें इनफिशिएंट फंड। नहीं तो हम बोल देंगे विथड्रॉन अमाउंट विथड्रॉन। बिल्कुल सेम लॉजिक करंट में भी है। सब कुछ सेम है। उसमें भी डिपॉजिट है। उसमें भी विथड्रॉ है और वही सब कर रहा है। अब आता है फिक्स्ड टर्म अकाउंट। अब इसने क्या किया? क्योंकि ये डिपॉजिट तो ईजीली कर सकता है। तो इसने डिपॉजिट कर दिया लेकिन इसके पास विथड्रॉ हैंडल करने का कोई तरीका नहीं था। तो उसने लॉजिकल एरर थ्रो कर दिया। सी तो यहां पे हमने क्या लिख दिया? थ्रो लॉजिकल एरर। पर अब इस एरर को थ्रो करने की वजह से क्या हुआ कि हमारा एक क्लाइंट हमने बनाया लेट्स से बैंक क्लाइंट। ठीक है? इस क्लाइंट को हमने एक लिस्ट दी अकाउंट्स की। ये देखो अकाउंट टाइप की एक लिस्ट है इसके पास। अब हमने इसको इंटर इसके कंस्ट्रक्टर के थ्रू ये लिस्ट असाइन करवा दी। अब इसमें एक ही मेथड है प्रोसेस ट्रांजैक्शन जो क्या करता है? लूप करता है इस लिस्ट में अकाउंट्स और हर बार उस अकाउंट का पहले डिपॉजिट कॉल करता है और फिर उस अकाउंट का विथड्रॉ कॉल करता है। अब देखो वैसे तो मैंने यहां पे ट्राई कैच ब्लॉक लगाया है क्योंकि मैं मान रहा हूं कि शायद कोई ना कोई ब्रेक कर दे पर रियल लाइफ में तो क्लाइंट को इतना भी नहीं पता होगा कि कोई एक्सेप्शन भी थ्रो कर सकता है। बट चलो फॉर द सेफ्टी पर्पस मैंने यहां पे फिर भी ट्राई कैच ब्लॉक लगा दिया। अगर आपको C++ में एक्सेप्शन हैंडलिंग अच्छे से आती है तो आप ये सब समझ पाओगे। पर अगर आपको नहीं आती है तो मैं आपको सजेस्ट करूंगा फटाफट से एक क्विक रिककैप वीडियो देख लो इस लेक्चर के बाद एक्सेप्शन हैंडलिंग के लिए क्योंकि वो बहुत यूज़ होगी पूरी की पूरी एलएलडी में। तो यहां पे मैंने ट्राई कैच ब्लॉक लगा दिया। ठीक है? तो अब देखो क्या होगा? जब ये प्रोसेस ट्रांजैक्शन चलेगा तो जोज अकाउंट्स इसमें अ क्या कहते हैं हमारे फिक्स्ड टर्म अकाउंट होंगे उसमें तो ये सारे डिपॉजिट्स सारे विथड्रॉ फट जाएंगे। उसमें एक्सेप्शन आ जाएगा। राइट? तो यही हमने देखो ये किया अकाउंट्स की लिस्ट बनाई और उसमें तीन अकाउंट्स पुश बैक कर दिए एक तो सेविंग्स एक करंट एक फिक्स्ड तो जैसे ही हमने ये दोनों जो है इसमें फिक्स्ड और सॉरी विथड्रॉ और डिपॉजिट दोनों चल जाएगा इसमें सिर्फ डिपॉजिट चलेगा विथड्रॉ नहीं चलेगा और फिर हमने क्या किया बैंक क्लाइंट को ये अकाउंट्स दिया और अकाउंट्स क्लाइंट का प्रोसेस ट्रांजैक्शन कॉल करा दिया अब अगर हम जब इसको रन करते हैं तो आप देखो क्या हुआ पहले तो डिपॉजिटेड विथड्रॉ डिपॉजिट विथड्रॉन चल गया उन दोनों के लिए लेकिन तीसरे के लिए सिर्फ डिपॉजिट चला थर्ड एक्सेप्शन आ गई विथड्रॉल के लिए कि विथड्रॉल नॉट अलाउड इन फिक्स्ड टर्म अकाउंट। तो यह हमारी दिक्कत है लिस्क ऑफ सब्स्टट्यूशन प्रिंसिपल की कि ये फॉलो नहीं हो रहा। अब वो वाला कोड देखते हैं जिसमें हमने इसे सॉल्व करने की कोशिश की थी गलत तरीके से। तो ये रहा वो कोड जिसमें हमने गलत तरीके से लिस्क ऑफ सब्स्टट्यूशन प्रिंसिपल को हैंडल किया था। तो सेम है ये भी बिल्कुल एकदम हमने क्या किया? देखो वही है। अकाउंट डिपॉजिट विथड्रॉ कर सकते हैं। सेविंग्स अकाउंट, करंट अकाउंट, फिक्स्ड टर्म अकाउंट। हमने कहा ये सब तो सेम ही रहेगा। फिक्स्ड टर्म अकाउंट भी बिल्कुल सेम है। करंट अकाउंट भी बिल्कुल सेम है। और सेविंग्स अकाउंट भी बिल्कुल सेम है। जैसा हमने पिछली बार देखा था। क्योंकि अभी भी देखो फिक्स्ड टर्म अकाउंट एक्सेप्शन ही थ्रो कर रहा है। लॉजिकल एरर एक्सेप्शन थ्रो कर रहा है। एक काम करते हैं ना क्लाइंट को अवेयर कर देते हैं। यही तो हमने बात की थी। तो क्लाइंट के प्रोसेस ट्रांजैक्शन में हमने चेंज कर दिया। हमने लूप किया था अकाउंट में डिपॉजिट कॉल कर रहे थे। अब पहले विथड्रॉ कॉल करने से पहले उसका टाइप देख लिया हमने कि अगर वो जो टाइप है वो फिक्स्ड टर्म अकाउंट का है तो हमने उसको स्किप कर दिया और बाकियों के लिए हमने विथड्रॉ कॉल करा दिया। पर यह तो गलत तरीका था। इसमें अगर आप कॉल करोगे तो उसके लिए वो स्किप हो जाएगा और बाकियों के लिए चल जाएगा। स्किपिंग विड्रॉल फॉर फिक्स्ड टर्म अकाउंट। ये चल तो गया पर ये गलत तरीका है क्योंकि यहां पे ओपन क्लोज प्रिंसिपल ब्रेक हो गया। क्योंकि हमने देखो लिटरली इस क्लास के अंदर जाकर के कोड चेंजज़ करने पड़े। अब ऐसे कल को और कई अकाउंट आएंगे तो भी हमने दोबारा इसी में कोड चेंजज़ करने पड़ेंगे। तो ये बेकार तरीका था। सही तरीका क्या था? वो ये रहा। तो ये रहा वो सही तरीका आपकी स्क्रीन पे। अब अगर आप इसको ध्यान से देखो तो हमारे पास क्या है? डिपॉजिट ओनली अ सॉरी इसको ऐसे देखते हैं। ठीक है? तो हमने क्या किया? हमने सबसे पहले अकाउंट की जो हायरार्की थी उसको अकाउंट की जो क्लास थी उसको हायरार्की में तोड़ा दो क्लास की। तो एक तो हमने बताया डिपॉजिट ओनली अकाउंट जिसको हमने नॉन विथड्रॉएबल अकाउंट बोला था अभी यूएमएल डायग्राम में। इसमें सिर्फ एक ही मेथड है डिपॉजिट जो कि एक वर्चुअल मेथड है। फिर हमने एक नया एब्स्ट्रैक्ट क्लास बनाई विथड्रॉएबल अकाउंट जो कि डिपॉजिट ओनली अकाउंट को इन्हहेरिट करता है और उसमें भी एक मेथड है विथड्रॉ। अब क्योंकि ये इसे इन्हनेट कर रहा है तो इसमें विथड्रॉ के साथ-साथ डिपॉजिट भी आ गया। राइट? तो यहां पे यही वो हमारी हायरार्की है जो हमने यूएमएल डायग्राम में बात की थी। अब हमने दो तरह के अकाउंट बनाए। तीन तरह के अकाउंट बनाए सेविंग्स, करंट और फिक्स्ड। तो हमारे सेविंग्स ने किसको इनहेरिट किया? विथड्रॉएबल अकाउंट को और डिपॉजिट और विथड्रॉ दोनों वैसे ही किया जैसे वो कर रहा था। राइट? सेम करंट ने भी विथड्रॉएबल अकाउंट को इन्हहेरिट किया और वैसे ही किया जैसे वो कर रहा था। फिक्स्ड टर्म अकाउंट ने सिर्फ डिपॉजिट ओनली अकाउंट को इन्हहेरिट किया क्योंकि यहां पे विद विथड्रॉन का ऑप्शन ही नहीं है और उसने सिर्फ डिपॉजिट को ओवराइड किया। विथड्रॉ को ओवराइड करने की जरूरत ही नहीं क्योंकि इसमें है ही नहीं। अब सेम जो हमारा क्लाइंट था उसमें भी थोड़े से चेंजज़ हैं। पहली बात तो अब क्लाइंट के पास एक लिस्ट नहीं बल्कि दो-दो लिस्ट हैं। एक विथड्रॉएबल अकाउंट्स की लिस्ट है और एक डिपॉजिट ओनली अकाउंट्स की लिस्ट है। सेम हमने इन कंस्ट्रक्टर के थ्रू इन लिस्ट को इनिशियलाइज़ करवाया। और अब जो प्रोसेस ट्रांजैक्शन का मेथड है उसमें हमने दो अलग-अलग लूप चलाए। एक विथड्रॉएबल के लिए, एक डिपॉजिट के लिए, विथड्रॉएबल में डिपॉजिट और विथड्रॉ दोनों कॉल हुए हैं और डिपॉजिट ओनली में सिर्फ डिपॉजिट कॉल हुआ है। दैट्स इट। इसके बाद यही हमारा मेन फंक्शन है। आप देख सकते हो। पहले दो लिस्ट बना ली। उन दोनों में कुछ-कुछ एलिमेंट पुशबैक किए। ये विथड्रॉएबल है तो सेविंग्स और करंट चला जाएगा। डिपॉजिट ओनली है तो फिक्स चला जाएगा। क्लाइंट का एक ऑब्जेक्ट बना लिया जिसमें ये दोनों लिस्ट पास की और उसका प्रोसेस ट्रांजैक्शन कॉल करा दिया। तो अगर हम इसका कोड देखेंगे तो यहां लो हमारा प्रिंट हो जाएगा। तो डिपॉजिटेड विथड्रॉन डिपॉजिटेड विथड्रॉन डिपॉजिटेड यहां पे विथड्रॉन है ही नहीं क्योंकि ये हमारा फिक्स्ड डिपॉजिट अकाउंट है। विथड्रॉ नहीं सपोर्ट करता। तो ये था लिस्क ऑफ सब्सीट्यूशन प्रिंसिपल। आई होप आपको ये समझ आया होगा। इसके अलावा हमारे सॉलिड डिज़ाइन प्रिंसिपल में दो प्रिंसिपल्स और रह गए हैं। एक है इंटरफ़ेस सेग्रगेशन प्रिंसिपल और एक डिपेंडेंसी इन्वर्जन प्रिंसिपल। उसको हम नेक्स्ट वीडियो में देखेंगे। तब तक के लिए थैंक यू सो मच।

Need a transcript for another video?

Get free YouTube transcripts with timestamps, translation, and download options.

Transcript content is sourced from YouTube's auto-generated captions or AI transcription. All video content belongs to the original creators. Terms of Service · DMCA Contact

SOLID Design Principles | Complete Guide with Code Exampl...