यदि आपने कभी ऑब्जेक्ट-ओरिएंटेड प्रोग्राम (OOP) बनाने में समय बिताया है, तो आपने अपने एप्लिकेशन में पॉलीमॉर्फिज्म का उपयोग किया होगा या, कम से कम, इस शब्द को सुना होगा।
यह उस तरह का शब्द है जिसे आप साइंस या कंप्यूटर साइंस की पाठ्यपुस्तक में देखने की उम्मीद करेंगे। आपने पॉलीमॉर्फिज्म पर शोध करने में समय बिताया होगा और यहां तक कि इसे अपने एप्लिकेशन में अवधारणा को स्पष्ट रूप से समझे बिना इम्प्लीमेंट भी किया होगा।
यह लेख आपको पॉलीमॉर्फिज्म की अधिक समझ देगा, विशेष रूप से रूबी ऑन रेल्स में। इसे पूरा करने के लिए, हम इसमें गोता लगाएंगे:
- वास्तविक दुनिया में पॉलीमॉर्फिज्म का उपयोग
- OOP के माध्यम से प्रोग्रामिंग में पॉलीमॉर्फिज्म
- आप इसे अपने रेल्स एप्लिकेशन में कैसे शामिल कर सकते हैं ताकि उच्च-गुणवत्ता वाले कोड को बनाए रखने में मदद मिल सके
चलिए शुरू करते हैं!
वास्तविक दुनिया में पॉलीमॉर्फिज्म
अलग-अलग संदर्भों में पॉलीमॉर्फिज्म को परिभाषित करने के कई तरीके हैं। एक उपयोगी परिभाषा, संदर्भ की परवाह किए बिना, है 'एक ऑब्जेक्ट की एक से अधिक रूप प्रदर्शित करने की क्षमता'। वास्तव में, यदि हम शब्द को ही तोड़ते हैं, तो पॉली का अर्थ है 'कई' और मॉर्फ का अर्थ है 'रूप'।
वास्तविक दुनिया में, इस परिभाषा का एक बुनियादी उदाहरण एक महिला हो सकती है जो एक पुलिस अधिकारी, बहन, किसी की बेटी, किसी की मां, आदि भी है। प्रत्येक भूमिका उसके व्यवहार को निर्धारित करती है और उस व्यक्ति में योगदान देती है जो वह है।
पॉलीमॉर्फिज्म और जेनेटिक्स
कंप्यूटर प्रोग्रामिंग के बाहर, पॉलीमॉर्फिज्म जीव विज्ञान और जेनेटिक्स से जुड़ा एक सामान्य शब्द है। इस संदर्भ में, पॉलीमॉर्फिज्म को अधिक विशिष्ट रूप से आनुवंशिक विविधताओं के रूप में परिभाषित किया जाता है जो एक प्रजाति के भीतर कई अलग-अलग रूपों या प्रकार के व्यक्तियों का परिणाम देते हैं।
जगुआर के बारे में सोचें। जगुआर में कई जीन विविधताएं हो सकती हैं, जो उनके फर के रंग को प्रभावित कर सकती हैं। अधिकांश जगुआर में काले घेरों के साथ तावनी रंग होता है। हालांकि, एक बदले हुए जीन के कारण उनके हल्के या गहरे घेरे हो सकते हैं, और कुछ का फर काले रंग का हो सकता है।
पक्षियों की एक ही प्रजाति के भीतर अलग-अलग पिगमेंटेशन पॉलीमॉर्फिज्म का एक और उदाहरण है। गॉल्डियन फिंच पर विचार करें, जिसमें व्यक्तियों के बीच उनके रंग में स्पष्ट अंतर होता है।
मोनोमॉर्फिज्म बनाम पॉलीमॉर्फिज्म
यदि हम अपना ध्यान मोनोमॉर्फिज्म पर केंद्रित करते हैं, तो हम पॉलीमॉर्फिज्म को और समझ सकते हैं। जीव विज्ञान से चिपके हुए, मोनोमॉर्फिज्म को 'एक प्रजाति जिसमें केवल एक रूप होता है' के रूप में परिभाषित किया जा सकता है, जो अपने विकास के विभिन्न चरणों के दौरान उसी रूप को बनाए रखता है।
पेंगुइन मोनोमॉर्फिक हैं। विशेषज्ञों के लिए भी लिंग के बीच अंतर करना मुश्किल है। एक पेंगुइन में जीन अंतर न्यूनतम हैं। इसलिए, पेंगुइन की शारीरिक विशेषताएं लगभग अविभाज्य हैं, विशेष रूप से उनके आकार और काले और सफेद रंग के संदर्भ में।
व्यवहारिक संकेत अक्सर मोनोमॉर्फिक प्रजातियों में लिंग के बीच अंतर करने का सबसे आसान तरीका होते हैं।
आइए प्रोग्रामिंग में पॉलीमॉर्फिज्म पर अपना ध्यान केंद्रित करें, विशेष रूप से।
OOP में पॉलीमॉर्फिज्म
यदि हम पॉलीमॉर्फिज्म की हमारी प्रारंभिक परिभाषा पर विचार करें - एक ऑब्जेक्ट की एक से अधिक रूप प्रदर्शित करने की क्षमता - तो हम इसे OOP से सहजता से जोड़ सकते हैं।
OOP में, हम अलग-अलग ऑब्जेक्ट्स पास करके एक ही मेथड का उपयोग करके अलग-अलग परिणाम उत्पन्न कर सकते हैं। हम इसे प्राप्त करने के लिए सशर्तों का उपयोग कर सकते हैं। हालांकि, यह चंकी कोड बना सकता है और हमें DRY सिद्धांतों से दूर ले जा सकता है। पॉलीमॉर्फिज्म स्वच्छ और तार्किक OOP एप्लिकेशन बनाने में आवश्यक है।
आइए देखें कि रूबी जैसी OOP भाषा में पॉलीमॉर्फिज्म को कैसे इम्प्लीमेंट किया जा सकता है: विरासत और डक-टाइपिंग के माध्यम से।
रूबी में पॉलीमॉर्फिज्म और विरासत
विरासत वह है जहां एक चाइल्ड क्लास पैरेंट क्लास के गुणों को विरासत में लेती है।
नीचे एक उदाहरण है कि हम विरासत के साथ पॉलीमॉर्फिज्म को कैसे इम्प्लीमेंट कर सकते हैं:
उपरोक्त कोड में दो चाइल्ड क्लासेस हैं - Stringed और Percussion - जो पैरेंट क्लास Instrument से विरासत में मिली हैं। यह उदाहरण पॉलीमॉर्फिक है, क्योंकि हम एक मेथड कॉल कर रहे हैं: instrument_example - और यह कई रूपों को आउटपुट करता है: Saxophone, Guitar, और Drums।
विरासत के माध्यम से पॉलीमॉर्फिज्म प्राप्त करने का यह उदाहरण अनिवार्य रूप से एक मेथड को ओवरराइड कर रहा है, लेकिन OOP भाषा में पॉलीमॉर्फिज्म की स्पष्ट समझ प्रदान करने में मदद करता है।
रूबी में डक-टाइपिंग और पॉलीमॉर्फिज्म
OOP में पॉलीमॉर्फिज्म का एक अधिक व्यावहारिक उदाहरण डक-टाइपिंग के माध्यम से है, जैसा कि नीचे संदर्भित है।
हालांकि प्रत्येक क्लास मेथड का नाम brand है, हम मेथड को ओवरराइड नहीं करते (पॉलीमॉर्फिक विरासत के विपरीत)। पैरेंट क्लास से विरासत लेने के बजाय, यहां हमारे पास चार स्वतंत्र क्लासेस हैं, प्रत्येक का अपना मेथड है। डक-टाइपिंग उपयोगी है, क्योंकि हम क्लासेस के माध्यम से पुनरावृति करके प्रत्येक मेथड का आउटपुट प्राप्त कर सकते हैं (प्रत्येक मेथड को अलग से कॉल करने के विपरीत)।
फिर से, डक-टाइपिंग पॉलीमॉर्फिक है क्योंकि हम एक मेथड - brand - कॉल करते हैं और एक आउटपुट उत्पन्न करते हैं जो कई रूप लेता है: Gibson, Pearl, Fender, और Casio। बेशक, डक-टाइपिंग और पॉलीमॉर्फिज्म इस परिणाम को उत्पन्न करने के लिए आवश्यक नहीं हैं। हालांकि, स्वच्छ और तार्किक कोड इम्प्लीमेंट करने के लिए यह बहुत उपयोगी है।
रूबी ऑन रेल्स में पॉलीमॉर्फिज्म
पॉलीमॉर्फिज्म रूबी ऑन रेल्स में एक Active Record एसोसिएशन के रूप में अच्छा काम करता है। यदि मॉडल अनिवार्य रूप से एक ही काम करते हैं, तो हम उन्हें पॉलीमॉर्फिक संबंध बनाने के लिए एक सिंगल मॉडल में बदल सकते हैं।
इंस्ट्रूमेंट थीम के साथ बने रहें, आइए एक ऐसे एप्लिकेशन पर विचार करें जहां यूजर्स इंस्ट्रूमेंट्स पोस्ट, कमेंट और रिव्यू कर सकते हैं। नीचे दिए गए एंटिटी-रिलेशनशिप डायग्राम (ERD) की जांच करें:

इस उदाहरण में, हमारे पास एक ERD है एक एप्लिकेशन के लिए जहां एक यूजर अपने विवरण के साथ एक इंस्ट्रूमेंट पोस्ट कर सकता है। एक यूजर उस पोस्ट किए गए इंस्ट्रूमेंट के बारे में कमेंट भी प्रदान कर सकता है।
अन्य यूजर्स तब इंस्ट्रूमेंट की रेटिंग प्रदान कर सकते हैं और कमेंट्स को रेट करके उनकी उपयोगिता या वैधता निर्धारित कर सकते हैं। ये Active Record एसोसिएशन ठीक काम करते हैं और हमारे एप्लिकेशन के उद्देश्य को पूरा करते हैं।
क्या होगा यदि हम अपने एप्लिकेशन में अन्य एसोसिएशन जोड़ना चाहते हैं? हमें डुप्लिकेट एसोसिएशन जोड़ने और दोहराने की आवश्यकता होगी।
उदाहरण के लिए, यदि हम एक यूजर की विश्वसनीयता को रेट करने के लिए एक user_rating मॉडल जोड़ना चाहते हैं, तो हमें अपने एसोसिएशन के साथ एक अलग टेबल बनाने की आवश्यकता होगी। इसका मतलब user और user_rating मॉडल के बीच एक नया संबंध जोड़ना होगा। ERD तब कुछ इस तरह दिखेगा:

अब हमारे पास अनिवार्य रूप से एक ही काम करने वाले तीन मॉडल हैं: एक ऑब्जेक्ट को रेट करना, लेकिन अलग-अलग संदर्भों में। ये एसोसिएशन पॉलीमॉर्फिक एसोसिएशन के लिए परिपक्व हैं।
आइए रेटिंग मॉडल्स के पॉलीमॉर्फिक होने के साथ ERD को देखें:

चूंकि हमारे पास एक rating कॉलम है, मैंने भ्रम से बचने के लिए मॉडल का नाम ratings के बजाय reviews रखा। यहां, नॉन-रिव्यू मॉडल्स का अभी भी अन्य मॉडल्स के साथ एसोसिएशन है, लेकिन अलग-अलग रेटिंग मॉडल्स को एक सिंगल रिव्यू मॉडल में मर्ज कर दिया गया है।
reviewable_type और reviewable_id अब अलग-अलग रेटिंग मॉडल्स के समान भूमिका निभाते हैं जिससे यह दर्शाया जाता है कि रिव्यू किस मॉडल से जुड़ा हुआ है।
reviewable_type कॉलम मॉडल क्लास नाम (user, instrument_post, या comment) को स्टोर करता है, और reviewable_id उस मॉडल की संबंधित आईडी को स्टोर करता है।
अब हम इन दो कॉलम्स का उपयोग रेटिंग इंटीजर को एक विशिष्ट यूजर, पोस्ट, या कमेंट के साथ Active Record क्वेरीज़ और/या सशर्त विवरणों के माध्यम से लिंक करने के लिए कर सकते हैं। फॉरेन की user_id रिव्यू मॉडल में बनी रहती है, क्योंकि यह हमें ट्रैक करने की अनुमति देता है कि किस यूजर ने रिव्यू छोड़ा।
अभी, हमारे पॉलीमॉर्फिक मॉडल में 'एबल' शब्द अजीब लग सकता है, लेकिन इसका उद्देश्य जल्द ही स्पष्ट हो जाएगा जब हम कुछ रेल्स मैजिक करेंगे।
रिव्यू मॉडल को पॉलीमॉर्फिक माना जाता है क्योंकि हमारे पास एक मॉडल या ऑब्जेक्ट है जो कई रूपों को प्रतिनिधित्व कर सकता है और ले सकता है: यूजर, कमेंट, और इंस्ट्रूमेंट पोस्ट रिव्यू।
रूबी ऑन रेल्स में पॉलीमॉर्फिज्म इम्प्लीमेंट करना
रेल्स एप्लिकेशन में पॉलीमॉर्फिज्म इम्प्लीमेंट करने का समय! यदि हम मान लें कि हमने पहले ही अपने user, instrument_post, और comment मॉडल बना लिए हैं, तो हम अपने पॉलीमॉर्फिक मॉडल: reviews को शामिल करने पर शुरू कर सकते हैं।
सबसे पहले, टर्मिनल से एक टेबल बनाएं और मॉडल जनरेट करें, जैसे:
यह माइग्रेशन फाइल बनाता है:
माइग्रेशन चलाने के बाद schema.rb फाइल अपडेट होती है। पॉलीमॉर्फिक विकल्प reviewable कॉलम को reviewable_type और reviewable_id कॉलम में बदल देता है:
याद रखें जब हमने ऊपर 'एबल' शब्द का उल्लेख किया था? यह हमारे पॉलीमॉर्फिक एसोसिएशन को नामित करने के लिए एक रेल्स नेमिंग कन्वेंशन है, जिससे हमें यूजर, इंस्ट्रूमेंट पोस्ट, और कमेंट को 'रिव्यूएबल' बनाने की क्षमता मिलती है।
इस रेल्स मैजिक के काम करने के लिए, हमें यह सुनिश्चित करने की आवश्यकता है कि हमारे अन्य मॉडल हमारे पॉलीमॉर्फिक मॉडल के साथ सही ढंग से जुड़े हुए हैं।
user, instrument_post, और comment मॉडल्स अब रिव्यू किए जा सकते हैं और रेटिंग दी जा सकती है।
यदि हमारे पास पहले से ही कम से कम दो यूजर्स, एक कमेंट, और एक इंस्ट्रूमेंट पोस्ट हैं, तो हम तब Active Record क्वेरीज़ जैसे विभिन्न तरीकों से रिव्यू बना सकते हैं और एक्सेस कर सकते हैं:
reviews मॉडल के साथ इंटरैक्ट करने के कई अन्य तरीके हैं, इस पर निर्भर करता है कि आपको कौन सा डेटा रेंडर करने की आवश्यकता है। यह साझा करना महत्वपूर्ण है कि पैरेंट मॉडल्स रिव्यू कैसे बना सकते हैं। जब तक रिव्यू एक यूजर और एक रिव्यूएबल मॉडल से जुड़ा हुआ है, Active Record ऑटोमैटिकली reviewable_id और reviewable_type को संबंधित मॉडल के साथ लिंक कर देता है।
हमारे रेल्स उदाहरणों में पॉलीमॉर्फिज्म के बिना, कई और टेबल्स, अनावश्यक डुप्लिकेट कॉलम्स, belongs_to, और has_many एसोसिएशन हमारे मॉडल्स में होंगे। पॉलीमॉर्फिज्म ने टेबल्स को जोड़ने की आवश्यकता को कम कर दिया है, जिससे आसान और तेज़ Active Record क्वेरीज़ और एसोसिएशन की अनुमति मिलती है।
समापन: स्वच्छ और तार्किक रूबी कोड के लिए पॉलीमॉर्फिज्म का उपयोग करें
इस पोस्ट में, हमने दो अलग-अलग वातावरणों में पॉलीमॉर्फिज्म का पता लगाया: जीव विज्ञान और रूबी प्रोग्रामिंग। दोनों मामलों में, पॉलीमॉर्फिज्म एक ऑब्जेक्ट की एक से अधिक रूप प्रदर्शित करने की क्षमता है।
हमने देखा कि रूबी में विरासत और डक-टाइपिंग के माध्यम से पॉलीमॉर्फिज्म को कैसे इम्प्लीमेंट किया जाए, इससे पहले रूबी ऑन रेल्स में विशेष रूप से पॉलीमॉर्फिज्म के उपयोगों में गोता लगाया।
पॉलीमॉर्फिज्म आपको स्वच्छ और तार्किक कोड लिखने में मदद कर सकता है। मेरा लक्ष्य आपको इस आवश्यक OOP अवधारणा को अपने टूलबेल्ट में जोड़ने में मदद करना है आपके वर्तमान, भविष्य, और शायद अतीत के एप्लिकेशन के लिए भी।
हैप्पी कोडिंग!
P.S. यदि आप रूबी मैजिक पोस्ट्स को प्रेस से निकलते ही पढ़ना चाहते हैं, तो हमारे रूबी मैजिक न्यूजलेटर को सब्सक्राइब करें और कभी भी एक भी पोस्ट मिस न करें!