কম্পিউটার টিউটোরিয়াল

dry-rb এক্সপ্লোর করুন: ১৮+ রুবি জেম জন্য রোবাস্ট, রি-ইউজেবল কোড

কিছু নতুন এবং আকর্ষণীয় জেম ট্রাই করতে চান?

তাহলে dry-rb-এ এক নজর দিন, এটি হলো জেমের একটি সেট যা সাধারণ সমস্যার সমাধান নিয়ে আসে। Dry-rb ১৮টিরও বেশি রুবি জেম দিয়ে কম্পোজ করা যা একসাথে বা আলাদা আলাদা কাজ করতে পারে।

এই জেমগুলোতে অন্তর্ভুক্ত:

  • dry-initializer
  • dry-struct
  • dry-validations
  • dry-events
  • dry-transaction

এই পোস্টে, আপনি এই জেমগুলো থেকে ৩টি সম্পর্কে শিখবেন যাতে dry-rb-এর স্বাদ পেতে পারেন!

dry-struct দিয়ে ভালো Struct তৈরি করা

একটি রুবি Struct হলো একটি ধরনের অবজেক্ট যা Struct ক্লাস থেকে তৈরি করা যায়, কিন্তু এর কিছু লিমিটেশন রয়েছে।

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

আপনি মিসিং আর্গুমেন্টের সাথে একটি struct তৈরি করতে পারেন এবং রুবি থেকে কোনো শিকায়ত পাবেন না।

dry-struct জেম দিয়ে আপনি স্ট্রিক্টার struct তৈরি করতে পারেন।

এখানে কীভাবে:

 require 'dry-struct' module Types include Dry::Types.module end class Video < Dry::Struct attribute :title, Types::String attribute :views, Types::Views attribute :comments, Types::Array end Video.new(title: "abc", views: 10, comments: []) 

এখন আপনি যদি অ্যাট্রিবিউটের যেকোনো একটি মিস করেন, তবে এই এরর পাবেন:

 [Video.new] :comments is missing in Hash input 

সবচেয়ে ইউজার-ফ্রেন্ডলি এরর মেসেজ নয়, কিন্তু কাজ চালিয়ে দেয়।

আপনি নিজের টাইপ তৈরি করতে পারেন এবং সেগুলোতে কনস্ট্রেইন্ট যোগ করতে পারেন:

 module Types include Dry::Types.module Age = Integer.constrained(gt: 0) end 

এই "gt" মানে "greater than"।

সুতরাং Age হতে হবে একটি ইন্টিজার যা ০ থেকে বড়।

ডিফল্ট ভ্যালু রাখা যায়?

হ্যাঁ, এখানে কীভাবে:

 module Types include Dry::Types.module Name = String.default('') end 

Dry struct তৈরি করার একটি শর্টার ভার্সনও আছে, যা রেগুলার রুবি struct-এর মত দেখায়।

উদাহরণ:

 Book = Dry::Struct(title: Dry::Types["string"]) Book.new(title: "Computer Science 101") 

dry-events দিয়ে অবজারভার প্যাটার্ন ইমপ্লিমেন্ট করা

অবজারভার ডিজাইন প্যাটার্ন হলো যখন একটি সোর্স একটি আপডেট পাবলিশ করে অনেক লিসেনার-কে, এটি হতে পারে একটি নিউজ আপডেট, স্টক এলার্ট, গ্রুপ চ্যাটে নতুন মেসেজ, ইত্যাদি।

এটি একটি সাধারণ প্যাটার্ন।

রুবি একটি অবজারবার মডিউল ইনক্লুড করে যা এটি ইমপ্লিমেন্ট করতে সাহায্য করে।

কিন্তু dry-events আরেকটি অপশন।

আপনি একটি পাবলিশার এভাবে তৈরি করতে পারেন:

 require 'dry/events/publisher' class Blog include Dry::Events::Publisher[:blog] register_event('article.published') register_event('article.upated') end 

এখন:

যেকোনো ক্লাস নিজেকে রেজিস্টার করতে পারে এই ইভেন্টগুলো হলে রিসিভ করতে।

এখানে কীভাবে:

 class Reader def on_article_published(event) puts "New article published: #{event[:title]}" end def on_article_updated(event) puts "Article has been updated: #{event[:title]}" end end blog = Blog.new reader = Reader.new blog.subscribe(reader) 

আপনি publish মেথড দিয়ে একটি ইভেন্ট ব্রডকাস্ট করতে পারেন:

 blog.publish('article.published', title: 'How to Use The dry-events Gem') 

এই জেমের সাথে একটা জিনিস লক্ষ্য করলাম যে আপনি যদি সাবস্ক্রাইব বা পাবলিশ করেন এমন একটি ইভেন্ট যা এক্সিস্ট করে না তবে এটি সাইলেন্টলি ফেইল করবে।

dry-auto_inject দিয়ে ডিপেন্ডেন্সি ইনজেকশন

ডিপেন্ডেন্সি কী?

একটি ডিপেন্ডেন্সি হলো এমন একটি জিনিস যা একটি ক্লাসকে কাজ করার জন্য দরকার, যেমন অন্যান্য অবজেক্ট এবং ক্লাস।

আপনি এই অবজেক্টগুলো সরাসরি আপনার ক্লাসে তৈরি করতে পারেন...

বা আপনি ডিপেন্ডেন্সি ইনজেকশন ব্যবহার করতে পারেন।

ডিপেন্ডেন্সি ইনজেকশন হলো যখন ডিপেন্ডেন্সিগুলো ক্লাসে "ইনজেক্ট" করা হয়। অন্য কথায়, সেগুলো প্যারামিটার হিসেবে পাস করা হয়।

উদাহরণ:

 require 'faraday' class GitHubAPI def initialize(http_client = Faraday.new) @http_client = http_client end end 

এটি করার ফলে আপনি ডিপেন্ডেন্সি কন্ট্রোল করতে পারেন এবং টেস্টিং সহজ হয়।

এখন:

dry-auto_inject এই অবজেক্টগুলো আপনার জন্য তৈরি করে। আপনাকে শুধু ডিক্লেয়ার করতে হবে কী ডিপেন্ডেন্সি দরকার।

এই উদাহরণে Fruit Store-এর ওপর ডিপেন্ডেন্ট:

 require 'dry/auto_inject' class Store def bananas puts 'Have some organic bananas!' end end Import = Dry::AutoInject({ 'store' => Store.new }) class Fruit include Import['store'] def eat store.bananas end end fruit = Fruit.new fruit.eat 

আপনাকে বলতে হবে অবজেক্টটি কীভাবে তৈরি হবে:

 Import = Dry::AutoInject({ 'store' => Store.new }) 

এবং ক্লাসের জন্য এটিকে উপলব্ধ করাতে হবে:

 include Import['store'] 

তারপর আপনি একটি Fruit তৈরি করতে পারেন ভিন্ন Store দিয়ে এভাবে:

 Fruit.new(store: MyStore.new) 

ডিপেন্ডেন্সি ইনজেকশন ব্যবহার করার জন্য জেম লাগে না, কিন্তু আরেকটি পদ্ধতি দেখতে পাওয়া আকর্ষণীয়।

সারসংক্ষেপ

আপনি dry-rb সম্পর্কে শিখেছেন, একটি আকর্ষণীয় রুবি জেম সেট যা আপনি আপনার কোডের নির্দিষ্ট ডিজাইন সমস্যা সমাধান করতে ব্যবহার করতে পারেন।

এখন আপনার পালা প্র্যাকটিস করুন এবং একবার চেষ্টা করুন!

পড়ার জন্য ধন্যবাদ।


  1. C++-এ অ্যারো অপারেটর (->) কী?

  2. C++-এ স্ট্যাটিক ক্লাস কীভাবে তৈরি করবেন?

  3. C#-এ নন-স্ট্যাটিক (Non-static) ক্লাস কী?

  4. প্রোগ্রামিং-এ ক্লাসের গুরুত্ব: কোড সংগঠন এবং অ্যাবস্ট্রাকশন বাড়ানো