মডিউল এবং মিক্সিনগুলি নিঃসন্দেহে দুর্দান্ত সংস্থান যা রুবিকে এত আকর্ষণীয় করে তোলে। তারা অ্যাপ্লিকেশনটিকে কোড শেয়ার করার ক্ষমতা দেয় যা অন্য জায়গায় সহজেই ব্যবহার করা যেতে পারে। এছাড়াও এটি কার্যকারিতা এবং উদ্বেগগুলিকে গোষ্ঠীবদ্ধ করে আমাদের কোড সংগঠিত করতে সাহায্য করে, যা আমাদের কোডের পঠনযোগ্যতা এবং রক্ষণাবেক্ষণযোগ্যতা উন্নত করে৷
এই নিবন্ধে, আমরা মডিউল এবং মিক্সিনের পিছনের ধারণাগুলির মধ্য দিয়ে যাব। আমরা শিখব কিভাবে অন্যান্য ক্লাসে মডিউল তৈরি এবং মিশ্রিত করা যায় এবং রুবি অন রেল অ্যাপ্লিকেশনে সেগুলি ব্যবহারের সুবিধাগুলি নিয়ে আলোচনা করব৷
আমি আশা করি আপনি ভ্রমণটি উপভোগ করবেন!
মডিউল কি
মডিউলগুলি রুবির সবচেয়ে উজ্জ্বল সম্পদগুলির মধ্যে একটি কারণ তারা দুটি দুর্দান্ত সুবিধা প্রদান করে:আমরা নামের সংঘর্ষ রোধ করতে নামস্থান তৈরি করতে পারি এবং আমরা অ্যাপ্লিকেশন জুড়ে কোড ভাগ করার জন্য সেগুলিকে মিক্সিন হিসাবে ব্যবহার করতে পারি৷
কাঠামোগত পদে, একটি মডিউল যেকোন রুবি ক্লাসের মতোই। আসলে, রুবির জন্য, একটি 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
লক্ষ্য করুন যে এইভাবে আমরা উত্তরাধিকার নীতির উপর রচনা ব্যবহার করি। এই নীতিটি দাঁড়িয়েছে যে আপনি যখনই পারেন রচনাটি ব্যবহার করতে পছন্দ করবেন। কম্পোজিশনে, আমরা এমন ক্লাস তৈরি করি যা অন্যদের নির্দিষ্ট কার্যকারিতা প্রদানের জন্য দায়ী, যা আমরা করছি।
এটাই সব লোক!
রুবি ডেভেলপার হিসেবে, আমাদের কোড পরিকল্পনা, লেখা, রক্ষণাবেক্ষণ এবং রিফ্যাক্টর করার সময় আমরা এর সুবিধা এবং সিনট্যাক্স চিনি ব্যবহার করতে পছন্দ করি। আমি আশা করি যে এই নিবন্ধটির মাধ্যমে আপনি উপলব্ধি করতে পারবেন যে কেন মডিউলগুলি আমাদের কোডের পাঠযোগ্যতা উন্নত করতে, জিনিসগুলিকে শুধুমাত্র একটি দায়িত্বের সাথে রাখতে এবং আমাদের কোডবেসকে পরিষ্কার এবং সহজে বজায় রাখতে সাহায্য করার জন্য এত বড় সম্পদ। এবং এটিও যে আমরা আমাদের কোডে মডিউলগুলি অন্তর্ভুক্ত করার জন্য মিক্সিন ম্যাজিক ব্যবহার করতে পারি যেখানে আমাদের একাধিক উত্স থেকে উত্তরাধিকার সূত্রে প্রাপ্ত করতে হবে৷
আমরা এখানে রুবি এবং রেলের সর্বশ্রেষ্ঠ সম্পদ সম্পর্কে কথা বলতে থাকব, তাই সাথে থাকুন!
পি.এস. আপনি যদি রুবি ম্যাজিক পোস্টগুলি প্রেস থেকে বের হওয়ার সাথে সাথে পড়তে চান তবে আমাদের রুবি ম্যাজিক নিউজলেটারে সাবস্ক্রাইব করুন এবং একটি পোস্টও মিস করবেন না!