मॉड्यूल और मिक्सिन, निस्संदेह, महान संसाधन हैं जो रूबी को इतना आकर्षक बनाते हैं। वे एप्लिकेशन को उस कोड को साझा करने की क्षमता देते हैं जिसका उपयोग अन्य स्थानों पर आसानी से किया जा सकता है। यह हमें कार्यात्मकताओं और चिंताओं को समूहीकृत करके हमारे कोड को व्यवस्थित करने में भी मदद करता है, जिससे हमारे कोड की पठनीयता और रखरखाव में सुधार होता है।
इस लेख में, हम मॉड्यूल और मिक्सिन के पीछे की अवधारणाओं के बारे में जानेंगे। हम सीखेंगे कि अन्य वर्गों में मॉड्यूल कैसे बनाएं और मिलाएं और रूबी ऑन रेल्स एप्लिकेशन में उनका उपयोग करने के लाभों पर चर्चा करें।
मुझे आशा है कि आप यात्रा का आनंद लेंगे!
मॉड्यूल क्या हैं
मॉड्यूल रूबी के सबसे चमकदार संसाधनों में से एक हैं क्योंकि वे दो महान लाभ प्रदान करते हैं:हम नाम संघर्ष को रोकने के लिए नाम स्थान बना सकते हैं और हम उन्हें पूरे एप्लिकेशन में कोड साझा करने के लिए मिश्रण के रूप में उपयोग कर सकते हैं।
संरचनात्मक शब्दों में, मॉड्यूल किसी भी रूबी वर्ग के समान ही है। वास्तव में, रूबी के लिए, एक Class
एक Module
है , जैसा कि हम नीचे irb
. में देख सकते हैं कंसोल:
> Class.is_a?(Module)
=> true
कक्षाओं के समान, मॉड्यूल के साथ हम विधियों और स्थिरांकों को समूहीकृत करते हैं और कोड साझा करते हैं। हालांकि, एक मॉड्यूल और एक सादे रूबी वर्ग के बीच कुछ अंतर हैं:
- हम परिभाषा की शुरुआत
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 # This includes our module in the Invoice class
def calculate_tax
total = invoice_total # included method from our module
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 >
इस तरह प्रत्येक विशिष्ट कोड को अपने स्वयं के मॉड्यूल के अंदर लपेटा जाएगा, चिंताओं को अलग करने के सिद्धांत का सम्मान करते हुए। इसके अलावा, हर जगह नेमस्पेसिंग भी हमारे कोड को व्यवस्थित रखने का एक शानदार तरीका है।
आइए अब देखें कि हम रूबी मॉड्यूल के अन्य लाभों का उपयोग कैसे कर सकते हैं:मिक्सिन।
मिश्रण का उपयोग करने का जादू
जैसा कि आप पहले से ही जानते होंगे, रूबी की एक विशेषता यह है कि यह एकल वंशानुक्रम तंत्र को लागू करता है, जिसका अर्थ है कि एक वर्ग केवल एक अन्य वर्ग से विरासत में मिल सकता है। हमें अक्सर अधिक वर्गों से विरासत में लेने की आवश्यकता हो सकती है। रूबी में, हम इनहेरिटेंस पैटर्न पर कंपोजिशन का उपयोग करके उस जरूरत को पूरा कर सकते हैं।
यह मिश्रणों के उपयोग से संभव है। जब हम किसी अन्य रूबी वर्ग में कोड का एक टुकड़ा मिलाते हैं तो हम इस वर्ग में विरासत का उपयोग किए बिना अधिक व्यवहार जोड़ रहे हैं और यह आश्चर्यजनक है। इसलिए, रूबी में, मिक्सिन मॉड्यूल होते हैं जिन्हें हम उन कक्षाओं में शामिल करते हैं जहां उनकी आवश्यकता होती है। इससे हमें अपने कोड को साफ रखने और जिम्मेदारियों को अलग रखने से लाभ होता है, जैसा कि उन्हें होना चाहिए।
उदाहरण के लिए, मान लें कि हमारा 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 # from InvoiceCalculator
generate_invoice_pdf # from InvoiceRenderer
send_invoice # from 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
ध्यान दें कि इस तरह हम वंशानुक्रम सिद्धांत पर रचना का उपयोग करते हैं। यह सिद्धांत खड़ा है कि जब भी आप कर सकते हैं आपको रचना का उपयोग करना पसंद करना चाहिए। रचना में, हम ऐसे वर्ग बनाते हैं जो दूसरों को विशिष्ट कार्य प्रदान करने के लिए जिम्मेदार होते हैं, ठीक यही हम कर रहे हैं।
बस इतना ही दोस्तों!
रूबी डेवलपर्स के रूप में, हम अपने कोड की योजना बनाते, लिखते, बनाए रखते और फिर से तैयार करते समय इसकी सुविधाओं और सिंटैक्स चीनी का उपयोग करना पसंद करते हैं। मुझे उम्मीद है कि इस लेख के माध्यम से आप समझ सकते हैं कि मॉड्यूल हमारे कोड की पठनीयता को बेहतर बनाने में मदद करने के लिए, केवल एक जिम्मेदारी के साथ चीजों को रखने के लिए और हमारे कोडबेस को साफ और बनाए रखने में आसान रखने के लिए इतने महान संसाधन क्यों हैं। और यह भी कि हम अपने कोड में मॉड्यूल्स को शामिल करने के लिए मिक्सिन मैजिक का उपयोग कर सकते हैं, जहां हमें कई स्रोतों से इनहेरिट करने की आवश्यकता होगी।
हम यहां रूबी और रेल के सबसे बड़े संसाधनों के बारे में बात करते रहेंगे, इसलिए बने रहें!
पी.एस. यदि आप रूबी मैजिक की पोस्ट प्रेस से बाहर होते ही पढ़ना चाहते हैं, तो हमारे रूबी मैजिक न्यूजलेटर की सदस्यता लें और एक भी पोस्ट मिस न करें!