কম্পিউটার

রুবি মেটাপ্রোগ্রামিং:বাস্তব-বিশ্বের উদাহরণ

আপনি রুবি মেটাপ্রোগ্রামিং সম্পর্কে আগে পড়ে থাকতে পারেন।

কিন্তু…

আপনার কাছে কয়েকটি নির্দিষ্ট উদাহরণ না থাকলে এটি কিছুটা বিভ্রান্তিকর হতে পারে।

তাই এই নিবন্ধে :

আমরা রুবি মেটাপ্রোগ্রামিং ব্যবহার করে কিছু জনপ্রিয় ওপেন সোর্স প্রজেক্ট দেখতে যাচ্ছি।

এর মতো প্রকল্পগুলি৷ :

  • রেল
  • সিনাত্রা
  • পেপারক্লিপ মণি

এরা সকলেই কোনো না কোনো মেটাপ্রোগ্রামিং ব্যবহার করে .

আসুন কোডের উপর যাই এবং তারা ঠিক কী করছে তা খুঁজে বের করি!

রেলের উদাহরণ

রেলগুলি মেটাপ্রোগ্রামিং এর ব্যাপক ব্যবহার করে, তাই এটি দেখতে শুরু করার জন্য একটি ভাল জায়গা৷

উদাহরণস্বরূপ :

আপনি যখন আপনার 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 তৈরি করে অবজেক্ট এবং ইনস্ট্যান্স ভেরিয়েবল সেট করে।

এখানে মূল সোর্স কোড।

উপসংহার

আপনি যেমন দেখেছেন, মেটাপ্রোগ্রামিং একটি অত্যন্ত শক্তিশালী এবং নমনীয় কৌশল, কিন্তু যখনই আপনি এটির জন্য পৌঁছাতে চান সেই উদ্ধৃতিটি মনে রাখবেন:"মহান শক্তির সাথে মহান দায়িত্ব আসে"৷

আপনি যদি এই পোস্টটি উপভোগ করেন তবে আমার নিউজলেটার সাবস্ক্রাইব করতে ভুলবেন না 🙂


  1. রুবি নির্বাচন পদ্ধতি কিভাবে ব্যবহার করবেন (উদাহরণ সহ)

  2. রুবি গ্রেপ পদ্ধতি কীভাবে ব্যবহার করবেন (উদাহরণ সহ)

  3. রুবি মানচিত্র পদ্ধতি কীভাবে ব্যবহার করবেন (উদাহরণ সহ)

  4. মেটাপ্রোগ্রামিং এর লুকানো খরচ