আপনি রুবি মেটাপ্রোগ্রামিং সম্পর্কে আগে পড়ে থাকতে পারেন।
কিন্তু…
আপনার কাছে কয়েকটি নির্দিষ্ট উদাহরণ না থাকলে এটি কিছুটা বিভ্রান্তিকর হতে পারে।
তাই এই নিবন্ধে :
আমরা রুবি মেটাপ্রোগ্রামিং ব্যবহার করে কিছু জনপ্রিয় ওপেন সোর্স প্রজেক্ট দেখতে যাচ্ছি।
এর মতো প্রকল্পগুলি৷ :
- রেল
- সিনাত্রা
- পেপারক্লিপ মণি
এরা সকলেই কোনো না কোনো মেটাপ্রোগ্রামিং ব্যবহার করে .
আসুন কোডের উপর যাই এবং তারা ঠিক কী করছে তা খুঁজে বের করি!
রেলের উদাহরণ
রেলগুলি মেটাপ্রোগ্রামিং এর ব্যাপক ব্যবহার করে, তাই এটি দেখতে শুরু করার জন্য একটি ভাল জায়গা৷
৷উদাহরণস্বরূপ :
আপনি যখন আপনার Rails অ্যাপে বর্তমান পরিবেশ পরীক্ষা করতে চান, আপনি নিম্নলিখিত মত কিছু করেন।
Rails.env.production?
কিন্তু env
কি ? এবং কিভাবে কাজ করে?
উত্তরগুলি StringInquirer
-এ রয়েছে ক্লাস, যা String
এর একটি সাবক্লাস . এই ক্লাসটি method_missing
ব্যবহার করে যাতে আপনি env.production?
কল করতে পারেন env == production
এর পরিবর্তে .
কোডটি দেখতে এইরকম৷ :
def method_missing(method_name, *arguments) if method_name[-1] == '?' self == method_name[0..-2] else super end end
এটি বলছে :
"যদি পদ্ধতির নামটি একটি প্রশ্ন চিহ্ন দিয়ে শেষ হয় তবে তুলনা করুন, অন্যথায় পূর্বপুরুষের চেইনটি চালিয়ে যান"৷
মূল কোড এখানে পাওয়া যাবে।
সিনাত্রা প্রতিনিধি দল
আপনি যদি আগে সিনাট্রা ব্যবহার করে থাকেন তাহলে আপনি হয়তো জানেন যে আপনার রুট নির্ধারণ করার দুটি উপায় আছে:
-
get
ব্যবহার করে /post
পদ্ধতি সরাসরি, যে কোন শ্রেণীর বাইরে। -
Sinatra::Application
থেকে উত্তরাধিকারসূত্রে প্রাপ্ত একটি শ্রেণী সংজ্ঞায়িত করে .
সিনাট্রা ডিএসএল (ডোমেন-নির্দিষ্ট ভাষা) পদ্ধতিগুলি Sinatra::Application
-এর ভিতরে সংজ্ঞায়িত করা হয়েছে , তাহলে কিভাবে আপনি তাদের এই ক্লাসের বাইরে ব্যবহার করতে পারেন?
আচ্ছা, এখানে দুটি জিনিস চলছে :
- মেটাপ্রোগ্রামিং
- মডিউল এক্সটেনশন
সিনাট্রা একটি Sinatra::Delegator
সংজ্ঞায়িত করে base.rb-এর ভিতরে মডিউল, যা একটি target
-এ মেথড কল অর্পণ করতে ব্যবহৃত হয় .
লক্ষ্য সেট করা হয়েছে Sinatra::Application
ডিফল্টরূপে।
এটি delegate
এর একটি সরলীকৃত সংস্করণ ক্লাস পদ্ধতি, Sinatra::Delegator
-এ সংজ্ঞায়িত :
def self.delegate(*methods) methods.each do |method_name| define_method(method_name) do |*args, &block| Delegator.target.send(method_name, *args, &block) end end end delegate :get, :patch, :put, :post, :delete
এই কোড পদ্ধতির একটি সেট তৈরি করছে (define_method
সহ ) যা পদ্ধতি কলগুলিকে Sinatra::Application
এ ফরোয়ার্ড করবে (Delegator.target
-এর ডিফল্ট মান )।
তারপর main
বস্তুটিকে Sinatra::Delegator
-এ সংজ্ঞায়িত পদ্ধতির সাথে প্রসারিত করা হয়েছে , যা সিনাট্রা ডিএসএলকে Sinatra::Application
এর বাইরে উপলব্ধ করে ক্লাস।
এটি লক্ষণীয় যে রুবির দুটি বিল্ট-ইন ক্লাস রয়েছে পদ্ধতি অর্পণ করার জন্য, যদি আপনার প্রয়োজন হয়:ডেলিগেটর এবং ফরওয়ার্ডেবল৷
পেপারক্লিপ জেম
পেপারক্লিপ হল একটি রত্ন যা আপনার অ্যাপ্লিকেশনকে ফাইল আপলোডগুলি পরিচালনা করতে দেয়৷ ফাইলগুলি ActiveRecord
এর সাথে যুক্ত মডেল।
আপনি has_attached_file
ব্যবহার করে একটি মডেলে একটি সংযুক্ত ফাইল সংজ্ঞায়িত করতে পারেন পদ্ধতি।
এরকম :
class User has_attached_file :avatar, :styles => { :normal => "100x100#" } end
এই পদ্ধতিটি paperclip.rb-এ সংজ্ঞায়িত করা হয়েছে এবং এটি মডেলের একটি পদ্ধতি নির্ধারণ করতে মেটাপ্রোগ্রামিং ব্যবহার করে।
এই পদ্ধতিটি ফাইল সংযুক্তি অ্যাক্সেস করতে ব্যবহার করা যেতে পারে (যা Paperclip::Attachment
এর একটি উদাহরণ ক্লাস)।
উদাহরণস্বরূপ, যদি সংযুক্ত ফাইলটি :avatar
হয় , Paperclip
একটি avatar
সংজ্ঞায়িত করবে মডেলে পদ্ধতি।
এখানে define_instance_getter
পদ্ধতি, যা এর জন্য দায়ী:
# @name => The name of the attachment # @klass => The ActiveRecord model where this method is being defined def define_instance_getter name = @name options = @options @klass.send :define_method, @name do |*args| ivar = "@attachment_#{name}" attachment = instance_variable_get(ivar) if attachment.nil? attachment = Attachment.new(name, self, options) instance_variable_set(ivar, attachment) end end end
এই কোড থেকে আমরা দেখতে পাচ্ছি যে সংযুক্তি বস্তুটি @attachment_#{name}
এর অধীনে সংরক্ষিত আছে ইনস্ট্যান্স ভেরিয়েবল।
আমাদের উদাহরণে সেটি হবে @attachment_avatar
.
তারপরে এটি এই সংযুক্তিটি ইতিমধ্যেই বিদ্যমান কিনা তা পরীক্ষা করে এবং যদি এটি না থাকে তবে এটি একটি নতুন Attachment
তৈরি করে অবজেক্ট এবং ইনস্ট্যান্স ভেরিয়েবল সেট করে।
এখানে মূল সোর্স কোড।
উপসংহার
আপনি যেমন দেখেছেন, মেটাপ্রোগ্রামিং একটি অত্যন্ত শক্তিশালী এবং নমনীয় কৌশল, কিন্তু যখনই আপনি এটির জন্য পৌঁছাতে চান সেই উদ্ধৃতিটি মনে রাখবেন:"মহান শক্তির সাথে মহান দায়িত্ব আসে"৷
আপনি যদি এই পোস্টটি উপভোগ করেন তবে আমার নিউজলেটার সাবস্ক্রাইব করতে ভুলবেন না 🙂