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

रेल एप्लिकेशन पर अपनी रूबी में मिक्सिन और मॉड्यूल का उपयोग कैसे करें

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

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

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

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

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

संरचनात्मक शब्दों में, मॉड्यूल किसी भी रूबी वर्ग के समान ही है। वास्तव में, रूबी के लिए, एक 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

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

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

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

हम यहां रूबी और रेल के सबसे बड़े संसाधनों के बारे में बात करते रहेंगे, इसलिए बने रहें!

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


  1. एक मैट्रिक्स क्या है और रूबी में इसका उपयोग कैसे करें?

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

  1. रूबी में स्ट्रक्चर और ओपनस्ट्रक्चर का उपयोग कैसे करें?

    रूबी में स्ट्रक्चर क्या है? एक संरचना एक अंतर्निहित रूबी वर्ग है, इसका उपयोग नए वर्ग बनाने के लिए किया जाता है जो मूल्य वस्तुओं का उत्पादन करते हैं। संबंधित विशेषताओं को एक साथ संग्रहीत करने के लिए एक मूल्य वस्तु का उपयोग किया जाता है। यहां एक उदाहरण दिया गया है : एक Point दो निर्देशांकों के साथ

  1. रेल एप्लिकेशन में OmniAuth-Twitter का उपयोग कैसे करें

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