Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Ruby

Ruby on Rails में मिक्सिन और मॉड्यूल में महारत: एक व्यावहारिक गाइड

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

इस लेख में, हम मॉड्यूल और मिक्सिन के पीछे की अवधारणाओं से गुजरेंगे। हम सीखेंगे कि अन्य क्लास में मॉड्यूल कैसे बनाएं और मिक्स करें और Ruby on Rails एप्लिकेशन में उनका उपयोग करने के लाभों पर चर्चा करेंगे।

मुझे आशा है कि आप यात्रा का आनंद लेंगे!

मॉड्यूल क्या हैं

मॉड्यूल Ruby के सबसे चमकदार संसाधनों में से एक हैं क्योंकि वे दो महान लाभ प्रदान करते हैं: हम नेमस्पेस बना सकते हैं नाम टकराव को रोकने के लिए और हम उन्हें मिक्सिन के रूप में उपयोग करके एप्लिकेशन में कोड साझा कर सकते हैं।

संरचनात्मक शब्दों में, एक मॉड्यूल किसी भी Ruby क्लास के समान है। वास्तव में, Ruby के लिए, एक Class एक Module है, जैसा कि हम नीचे irb कंसोल में देख सकते हैं:

> Class.is_a?(Module) => true

क्लास के समान, मॉड्यूल के साथ हम मेथड्स और कॉन्स्टेंट्स को समूहित करते हैं और कोड साझा करते हैं। हालांकि, एक मॉड्यूल और एक सादे Ruby क्लास के बीच कुछ अंतर हैं:

  • हम परिभाषा को module कीवर्ड से शुरू करते हैं class के बजाय;
  • हम मॉड्यूल को इंस्टेंटिएट नहीं कर सकते, इसलिए इससे कोई ऑब्जेक्ट नहीं बनाया जा सकता;
  • हम मॉड्यूल से इनहेरिट नहीं कर सकते, इसलिए हम उन्हें मिक्सिन के रूप में उपयोग करते हैं;
  • मॉड्यूल स्टैंडअलोन कोड हैं, इसलिए मॉड्यूल का कोई इनहेरिटेंस पदानुक्रम नहीं है;

मॉड्यूल सेवाओं, चिंताओं, कॉन्स्टेंट्स और किसी भी अन्य कोड को रखने के लिए शानदार स्थान हैं जो एक ही जिम्मेदारी होने से एक साथ रहना चाहिए।

यह है कि एक मॉड्यूल कैसा दिखना चाहिए:

# lib/modules/invoice_creator.rb module InvoiceCreator TAX_FEE = 0.5 def self.generate puts "Don't worry! I'll generate the invoice for you at #{TAX_FEE}%" end def invoice_total puts "I'll return the invoice total" 1000 end end

इस उदाहरण में, हम देख सकते हैं कि एक मॉड्यूल दो प्रकार के मेथड प्रदान कर सकता है: मॉड्यूल मेथड्स और इंस्टेंस मेथड्स।

self.generate एक मॉड्यूल मेथड है, जिसका अर्थ है कि हम इसे किसी अन्य ऑब्जेक्ट में मॉड्यूल को शामिल (या विस्तार) किए बिना उपयोग कर सकते हैं। यह बहुत आम है जब हम सर्विस ऑब्जेक्ट बना रहे होते हैं, उदाहरण के लिए। हम अपने मॉड्यूल मेथड को इस तरह कॉल कर सकते हैं:

2.5.3 :006 > InvoiceCreator.generate Don't worry! I'll generate the invoice for you => nil

invoice_total एक इंस्टेंस मेथड है और इसका उपयोग करने में सक्षम होने के लिए हमें मॉड्यूल को एक क्लास में शामिल करने की आवश्यकता है, जैसे:

# app/models/invoice.rb class Invoice < ApplicationRecord include InvoiceCreator # यह हमारे मॉड्यूल को Invoice क्लास में शामिल करता है def calculate_tax total = invoice_total # हमारे मॉड्यूल से शामिल मेथड tax = total * InvoiceCreator::TAX_FEE puts "This is the invoice tax: #{tax}" end end

InvoiceCreator के सभी इंस्टेंस मेथड Invoice इंस्टेंस के लिए उपलब्ध हो जाते हैं, इसलिए हम calculate_tax मेथड को बहुत आसानी से कॉल कर सकते हैं:

2.5.3 :008 > Invoice.new.calculate_tax "I'll return the invoice total" "This is the invoice tax: 500.0" => nil 2.5.3 :009 >

इसके अलावा, calculate_tax के अंदर आप देखते हैं कि हम एक कॉन्स्टेंट का उपयोग कर रहे हैं जिसे हमारे मॉड्यूल के अंदर परिभाषित किया गया था। जैसा कि मैंने पहले उल्लेख किया था, मॉड्यूल महान कॉन्स्टेंट रखने वाले हैं!

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

हर जगह नेमस्पेस

नेमस्पेस को एक तरीके के रूप में परिभाषित किया जा सकता है जिससे हम अपने कोड को व्यवस्थित करते हैं जब हम किसी दी गई कार्यक्षमता के लिए एक स्थानीय संदर्भ बनाना चाहते हैं, जो कि उस परिदृश्य के लिए हमें चाहिए जो मैंने अभी वर्णित किया: ग्राहक के इनवॉइस क्रिएटर के लिए एक अलग संदर्भ और सप्लायर के इनवॉइस क्रिएटर के लिए एक और।

आइए हमारे कोड पर वापस जाएं। हमें दो अलग-अलग मॉड्यूल बनाने की आवश्यकता होगी:

# lib/modules/customer/invoice_creator.rb module Customer module InvoiceCreator def self.generate puts "Don't worry! I'll generate the customer invoice for you" end end end # lib/modules/supplier/invoice_creator.rb module Supplier module InvoiceCreator def self.generate puts "Don't worry! I'll generate the supplier invoice for you" end end end

तब हम Customer::InvoiceCreator या Supplier::InvoiceCreator का उपयोग कर सकते हैं जहां हमें इसकी आवश्यकता है:

2.5.3 :014 > Customer::InvoiceCreator.generate Don't worry! I'll generate the customer invoice for you => nil 2.5.3 :015 > Supplier::InvoiceCreator.generate Don't worry! I'll generate the supplier invoice for you => nil 2.5.3 :016 >

इस तरह प्रत्येक विशिष्ट कोड अपने स्वयं के मॉड्यूल के अंदर लपेटा जाएगा, चिंताओं के पृथक्करण सिद्धांत का सम्मान करते हुए। इसके अलावा, हर जगह नेमस्पेसिंग हमारे कोड को अच्छी तरह से व्यवस्थित रखने का एक शानदार तरीका है।

आइए अब देखें कि हम Ruby मॉड्यूल के अन्य लाभों का उपयोग कैसे कर सकते हैं: मिक्सिन।

मिक्सिन का उपयोग करने का जादू

जैसा कि आप पहले से ही जानते होंगे, Ruby की एक विशेषता यह है कि यह सिंगल इनहेरिटेंस तंत्र को लागू करता है, जिसका अर्थ है कि एक क्लास केवल एक अन्य क्लास से इनहेरिट कर सकती है। हमें अक्सर एक से अधिक क्लास से इनहेरिट करने की आवश्यकता हो सकती है। Ruby में, हम संरचना पर इनहेरिटेंस पैटर्न का उपयोग करके उस आवश्यकता को कवर कर सकते हैं।

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

उदाहरण के लिए, मान लीजिए कि हमारा InvoiceCreator मॉड्यूल एक सेवा है जिसे कई अन्य मॉड्यूल द्वारा प्रदान की जाने वाली कार्यक्षमताओं का उपयोग करने की आवश्यकता है, जैसे InvoiceCalculator, InvoiceRenderer और InvoiceSender, इनवॉइस निर्माण प्रक्रिया को पूरा करने के लिए आवश्यक होंगे।

हम इसे मॉड्यूल की एक श्रृंखला को अपने कोड में मिक्सिन के रूप में शामिल करके प्राप्त कर सकते हैं, ताकि हम मेथड्स को सीधे उपयोग कर सकें, जैसे नीचे दिए गए उदाहरण:

# lib/modules/invoice_calculator.rb module InvoiceCalculator def calculate_items_total puts "imagine some math here" end end # lib/modules/invoice_renderer.rb module InvoiceRenderer def generate_invoice_pdf puts "imagine that we are using some PDF generation magic here" end end # lib/modules/invoice_sender.rb module InvoiceSender def send_invoice puts "imagine your favorite mail service being used here" end end

चूंकि हम InvoiceCreator को अन्य तीन मॉड्यूल से इनहेरिट नहीं कर सकते, हम उन्हें शामिल कर रहे हैं। इस तरह InvoiceCreator अन्य इनवॉइस मॉड्यूल से सभी मेथड्स शामिल करता है, और हम इन मेथड्स को किसी भी क्लास/मॉड्यूल में कॉल कर सकते हैं जिसमें InvoiceCreator मॉड्यूल शामिल होता है। सावधान रहें! यदि किसी मॉड्यूल में समान नाम के मेथड हैं, तो वे एक-दूसरे को ओवरराइट कर देंगे।

# lib/modules/customer/invoice_creator.rb module Customer module InvoiceCreator include InvoiceCalculator include InvoiceRenderer include InvoiceSender def generate_invoice calculate_items_total # InvoiceCalculator से generate_invoice_pdf # InvoiceRenderer से send_invoice # InvoiceSender से end end end

अब हम अपनी सेवा मेथड्स को कहीं भी कॉल कर सकते हैं जहां हम इसे शामिल करते हैं:

# app/models/invoice.rb class Invoice < ApplicationRecord include Customer::InvoiceCreator def send_invoice_to_customer puts "Don't worry! I'll generate the customer invoice for you" generate_invoice end end

यह परिणाम होगा, InvoiceCreator मॉड्यूल के माध्यम से शामिल इनवॉइस मॉड्यूल से मेथड्स को कॉल करना:

2.5.3 :051 > Invoice.new.generate_invoice Don't worry! I'll generate the supplier invoice for you imagine some math here imagine that we are using some PDF generation magic here imagine your favorite mail service being used here => nil

ध्यान दें कि यह है कि हम संरचना पर इनहेरिटेंस सिद्धांत का उपयोग कैसे करते हैं। यह सिद्धांत बताता है कि जब भी आप कर सकते हैं संरचना का उपयोग करना पसंद करना चाहिए। संरचना में, हम क्लास बनाते हैं जो दूसरों को विशिष्ट कार्यक्षमताएं प्रदान करने के लिए जिम्मेदार हैं, जो वास्तव में हम कर रहे हैं।

बस इतना ही दोस्तों!

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

हम यहां Ruby और Rails के महानतम संसाधनों के बारे में बात करते रहेंगे, तो बने रहें!

P.S. यदि आप Ruby Magic पोस्ट को प्रेस से निकलते ही पढ़ना चाहते हैं, तो हमारे Ruby Magic न्यूज़लेटर की सदस्यता लें और कभी भी एक भी पोस्ट मिस न करें!

  1. रूबी मैट्रिक्स को समझना: परिभाषा, अनुप्रयोग और उन्हें कैसे बनाएं रूबी मैट्रिक्स को समझना: परिभाषा, अनुप्रयोग और उन्हें कैसे बनाएं

    मैट्रिक्स एक 2D (2-डायमेंशनल) ऐरे है जिसका उपयोग स्प्रेडशीट जैसे डेटा को स्टोर और काम करने के लिए किया जा सकता है। इनका उपयोग किया जा सकता है: टेबल गेम में बोर्ड को दर्शाना (शतरंज, चेकर्स, आदि) आंकड़े और डेटा विश्लेषण प्लॉट्स और ग्राफ़ उत्पन्न करना क्योंकि यह एक शक्तिशाली डेटा संरचना है इसलिए इसका

  1. रूबी स्ट्रक्ट्स और OpenStruct में महारत: कुशल वैल्यू ऑब्जेक्ट्स रूबी स्ट्रक्ट्स और OpenStruct में महारत: कुशल वैल्यू ऑब्जेक्ट्स

    रूबी में स्ट्रक्ट क्या है? एक स्ट्रक्ट एक बिल्ट-इन रूबी क्लास है, इसका उपयोग वैल्यू ऑब्जेक्ट्स उत्पन्न करने वाली नई क्लासेस बनाने के लिए किया जाता है। एक वैल्यू ऑब्जेक्ट संबंधित विशेषताओं को एक साथ संग्रहीत करने के लिए उपयोग किया जाता है। यहां एक उदाहरण है: दो निर्देशांकों (x और y) के साथ एक Point।

  1. OmniAuth-Twitter के साथ Rails में ट्विटर लॉगिन एकीकृत करें: चरण-दर-चरण मार्गदर्शिका OmniAuth-Twitter के साथ Rails में ट्विटर लॉगिन एकीकृत करें: चरण-दर-चरण मार्गदर्शिका

    इस ट्यूटोरियल में, आप सीखेंगे कि अपने एप्लिकेशन के उपयोगकर्ताओं को उनके ट्विटर खाते का उपयोग करके लॉग इन करने की अनुमति कैसे दें। OAuth जैसे टूल के साथ ऐसा करना आसान हो गया है। आप OmniAuth-Twitter का उपयोग करेंगे, जिसमें OmniAuth के लिए ट्विटर रणनीति शामिल है। चलिए शुरू करते हैं! शुरुआत करना अपना R