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

রুবির স্ট্র্যাটেজি প্যাটার্ন আয়ত্ত করুন: অ্যালগরিদম ডাইনামিক্যালি সোয়াপ করুন ও Open/Closed Principle ফলো করুন

স্ট্র্যাটেজি ডিজাইন প্যাটার্ন নিয়ে কথা বলি!

এই ডিজাইন প্যাটার্ন আপনাকে একটি মেথডের মূল অ্যালগরিদম পরিবর্তন করতে সাহায্য করে।

আপনি এটি করে এই অ্যালগরিদম ইমপ্লিমেন্ট করা একটি ক্লাস পাস করলে, ক্লাসের ভেতরে হার্ডকোড না করে।

এবং যখন আমি অ্যালগরিদম বলছি, আমি কোনো ফ্যান্সি কম্পিউটার সায়েন্স অ্যালগরিদম বলছি না, বরং যেকোনো কোড যা একটি সিকোয়েন্স অফ স্টেপ ফলো করে ফলাফল পেতে।

স্ট্র্যাটেজি প্যাটার্ন কখন ব্যবহার করবেন

এই প্যাটার্নটি কী সমস্যা সমাধান করছে সঠিকভাবে?

Open/Closed Principle সমস্যাটি।

এই প্রিন্সিপল বলে:

"সফটওয়্যার এন্টিটি (ক্লাস, মডিউল, মেথড) এক্সটেনশনের জন্য ওপেন হওয়া উচিত এবং মডিফিকেশনের জন্য ক্লোজড।"

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

কিন্তু আপনি এটি কীভাবে অর্জন করবেন?

স্ট্র্যাটেজি প্যাটার্নের মতো ডিজাইন প্যাটার্ন ব্যবহার করে 🙂

মান লেন আপনার একটি ReportGenerator ক্লাস আছে, এবং আপনি একই ডেটা ব্যবহার করে অনেক ধরণের রিপোর্ট ফরম্যাট জেনারেট করতে চান।

আপনি প্রতিটি রিপোর্ট টাইপের জন্য একটি মেথড লিখতে পারেন, কিন্তু এর মানে হচ্ছে আপনাকে ক্লাসটি পরিবর্তন করতে হবে (নতুন মেথড যোগ করে) প্রতিবার আপনি একটি নতুন টাইপ যোগ করতে চান, যা Open/Closed Principle ভাঙে।

অথবা আরও খারাপ!

আপনার একটি একক বিশাল মেথড থাকতে পারে সব ধরনের if স্টেটমেন্টসহ... এগুলো সাধারণত ভালো ফলাফল দেয় না।

কিন্তু যদি ক্লাসটিকে না জানতে হয় কীভাবে রিপোর্ট ফরম্যাট করতে হয়?

যদি অ্যালগরিদম ক্লাসের বাইরে থেকে আসে?

তখন আমরা ফরম্যাটিং অ্যালগরিদম যেকোনো সময় পরিবর্তন করতে পারি ক্লাসকে ছেড়ে ছাড়া।

এটি সমস্যাটি সমাধান করে।

এবং এটিই হলো স্ট্র্যাটেজি প্যাটার্ন-এর সব কীচ।

স্ট্র্যাটেজি প্যাটার্ন উদাহরণ

একটি স্ট্র্যাটেজি একটি ক্লাস আকারে ইমপ্লিমেন্ট করা হয় যার একটি মেথড থাকে।

ReportGenerator ক্লাসের জন্য কিছু ফরম্যাটিং স্ট্র্যাটেজি:

require 'json'
module ReportFormatters
  class JSON
    def self.format(data)
      data.to_json
    end
  end
  class PlainText
    def self.format(data)
      data.to_s
    end
  end
  class HTML
    def self.format(data)
      html = ""
      html << "
    " data.each { |product, amount| html << "
  • #{product}: #{amount}
  • " } html << "
" html end end end

লক্ষ্য করুন কীভাবে সব স্ট্র্যাটেজি format মেথড ইমপ্লিমেন্ট করেছে। এই মেথডটি রিপোর্ট জেনারেটর ক্লাস দ্বারা কল হবে।

এখানে কোডটি:

class ReportGenerator
  def self.generate(data, formatter)
    formatter.format(data)
  end
end
data = { onions: 31, potatoes: 24, eggs: 10 }
p ReportGenerator.generate(data, ReportFormatters::HTML)
p ReportGenerator.generate(data, ReportFormatters::JSON)
p ReportGenerator.generate(data, ReportFormatters::PlainText)

এখন:

যদি আপনি আউটপুট ফরম্যাট পরিবর্তন করতে চান (HTML থেকে PlainText) তবে আপনাকে শুধু একটি ভিন্ন স্ট্র্যাটেজি পাস করতে হবে এবং এটি কাজ করবে যতক্ষণ না স্ট্র্যাটেজি format মেথড ইমপ্লিমেন্ট করে।

এই প্যাটার্ন সম্পর্কে আরেকটি ভাব করার উপায় হলো আপনি একটি কনসাল্টেন্ট নিয়ে আসছেন যিনি নির্দিষ্ট বিজনেস স্ট্র্যাটেজিতে বিশেষজ্ঞ, কনসাল্টেন্টটি আসবেন এবং আপনার জন্য স্ট্র্যাটেজি ইমপ্লিমেন্ট করবেন, তারপর এই স্ট্র্যাটেজি একটি নির্দিষ্ট ফলাফল দেবে।

বিপরীতে, ডেকোরেটর প্যাটার্নের মতো একটি প্যাটার্ন হলো একটি ক্রিসমাস গাছে নতুন অর্নামেন্ট যোগ করা যাতে সেটি আরও চমকদার হয়।

আপনি একবারে শুধু একটি স্ট্র্যাটেজি নিয়ে কাজ করতে পারেন, কিন্তু আপনি যত চান उतنی অর্নামেন্ট রাখতে পারেন।

ভিডিও

সারসংক্ষেপ

আপনি স্ট্র্যাটেজি ডিজাইন প্যাটার্ন সম্পর্কে শিখতে পেরেছেন, এটি ব্যবহার করুন যখন আপনাকে আপনার ক্লাস যা করছে তার একটি অংশ পরিবর্তন করতে হয় ক্লাসকে পরিবর্তন না করে।

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

যদি আপনি এটি আকর্ষণীয় পান তবে এই পোস্টটি টুইটারে শেয়ার করুন, এটি আরও মানুষকে উপভোগ করতে সাহায্য করবে 🙂

  1. রুবি মাস্টারিং: মেথড এলিয়াস তৈরি করার জন্য Alias কিওয়ার্ড ব্যবহার

  2. রুবির grep মেথড মাস্টারিং: কোড উদাহরণসহ একটি ব্যবহারিক গাইড

  3. রুবি অবজেক্ট ডেকোরেটর প্যাটার্ন দিয়ে সমৃদ্ধ করুন: একটি প্র্যাক্টিক্যাল গাইড

  4. রুবি অ্যারে 습득: প্র্যাক্টিক্যাল উদাহরণ এবং অপরিহার্য মেথডগুলো