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

AASM দিয়ে রুবিতে স্টেট মেশিন মাস্টার করুন: একটি প্র্যাক্টিক্যাল গাইড

আজ আপনি স্টেট মেশিন, কীভাবে কাজ করে এবং AASM জেম দিয়ে আপনার রুবি প্রজেক্টগুলতে কীভাবে ব্যবহার করবেন তা শিখবেন।

এখন:

একটি ট্রাফিক লাইট কল্পনা করুন...

এটি লাল, সবুজ বা হলুদ হতে পারে।

যখন এটি রঙ পরিবর্তন করে, পরবর্তী রঙটি বর্তমান রঙের ওপর ভিত্তি করে হয়।

AASM দিয়ে রুবিতে স্টেট মেশিন মাস্টার করুন: একটি প্র্যাক্টিক্যাল গাইড

ধরুন এটি এমন একটি যা অন্ধ মানুষের জন্য শব্দ করে যাতে তারা জানতে পারে কখন রাস্তা পার করবেন।

এখন:

আপনি এই জিনিসের জন্য সফ্টওয়্যার লিখছেন।

আপনি কীভাবে জানবেন প্রতি বারে কী শব্দ প্লে করতে হবে এবং পরবর্তী রঙটি কী হবে?

আপনি কিছু if স্টেটমেন্ট লিখতে পারেন এভাবে:

 if @light.state == "green" @light.play_green_sound end if @light.state == "green" @light.change_to_yellow end # ... 

এই স্টেট চেকিং কোড সব জায়গায় ছড়িয়ে থাকবে!

আমরা এটিকে কীভাবে উন্নত করতে পারি?

আপনি যদি অবজেক্ট-অরিয়েন্টেড ডিজাইন প্রিন্সিপল অ্যাপ্লাই করেন তবে আপনি State Design Pattern আবিষ্কার করবেন।

State Design Pattern কী?

State Design Pattern হলো একটি স্টেট মেশিন ইমপ্লিমেন্ট করার একটি পদ্ধতি।

আপনাকে ৩টি কম্পোনেন্ট দরকার:

  • একটি Context ক্লাস, এই ক্লাস জানে বর্তমান স্টেট কী
  • একটি State ক্লাস, এই ক্লাস ডিফাইন করে যে মেথডগুলো ইনডিভিজুয়াল স্টেটগুলো ইমপ্লিমেন্ট করবে
  • প্রতিটি স্টেটের জন্য একটি ক্লাস। এই ক্লাসগুলো State ক্লাস থেকে ইনহেরিট করবে

আমাদের ট্রাফিক লাইট উদাহরণে, কন্টেক্সট হলো TrafficLight নিজে।

এবং স্টেটগুলো হলো Green, Red এবং Yellow।

প্রতিটি স্টেট জানবে কী করতে হবে।

বড় সুবিধা?

প্রতিটি סטেট নিজে কে জানে তাই বর্তমান স্টেট চেক করার প্রয়োজন নেই। এটি কম কন্ডিশনাল স্টেটমেন্টে রূপান্তরিত হয় যা প্রায়শই জটিলতার উৎস।

ট্রাফিক লাইট ইমপ্লিমেন্টেশন

চলুন এই প্যাটার্নের একটি একচুয়া ইমপ্লিমেন্টেশন কোড দেখি।

এখানে TrafficLight:

 class TrafficLight def initialize @state = nil end def next_state(klass = Green) @state = klass.new(self) @state.beep @state.start_timer end end 

এখানে বেস State:

 class State def initialize(light) @light = light end def beep end def next_state end def start_timer end end 

হ্যাঁ, এই ৩টি মেথড খালি।

অন্য প্রোগ্রামিং ল্যাঙ্গুয়েজে (যেমন Java) এই "ইন্টারফেস" ডিফাইন করা একটি সাধারণ কনভেনশন, কিন্তু রুবিতে এটি জনপ্রিয় নয়।

এটি এখানে ডেমонস্ট্রেশন PURPOSE-র জন্য।

তবে, আমরা এখনো চাই initialize মেথডটি সব স্টেটের মাঝপথে শেয়ার করা হয় কারণ সকলকে কন্টেক্সট (TrafficLight অবজেক্ট) দরকার স্টেট চেঞ্জ সিগন্যাল করার জন্য।

এখন:

৩টি স্টেটের কোড একে অপরের সাথে খুব মিল, তাই আমি শুধু একটি দেখাব।

এখানে Green স্টেট:

 class Green < State def beep puts "Color is now green" end def next_state @light.next_state(Yellow) end def start_timer sleep 5; next_state end end 

প্রতিটি স্টেট জানে কীভাবে এবং কখন পরবর্তী স্টেটে স্যুইচ করতে হবে।

AI গেম উদাহরণ

আপনি একটি স্টেট মেশিন ব্যবহার করতে পারেন olyan গেম সমাধান করতে যা বর্তমান স্টেটের ওপর ডিপেন্ড করে, যেন RubyWarrior।

RubyWarrior-এ আপনাকে একটি প্লেয়ার অবজেক্ট এবং একটি বোর্ড দেওয়া হয়।

লক্ষ্যগুলো হলো:

  • বোর্ডের সব শত্রুকে হারান
  • HP ০-এর উপরে রেখে এক্সিট পর্যন্ত পৌঁছান

আপনি একবারে এক মুভ করতে পারেন এবং লেভেল কমপ্লিট করতে চাইলে একটি ভালো চয়েস করতে হবে।

বর্তমান স্টেট দেখে আপনি সেটা চয়েস করতে পারেন।

সেই কারণেই একটি স্টেট মেশিন একটি ভালো সমাধান।

এখানে একটি উদাহরণ:

 class Attacking < State def play(warrior) warrior.attack! @player.set_state(Healing) unless enemy_found?(warrior) end end 

এটি আমাদের ওয়ারিয়র যে স্টেটগুলোর একটি হতে পারে, যখন আমাদের কোনো শত্রু সাইটে নেই তখন আমরা Healing স্টেটে যাই ব্যাটল ডেমেজ থেকে রিকভার করার জন্য।

AASM জেম ব্যবহার করা

আপনি যদি বর্তমান স্টেট ট্র্যাক করতে চান এবং নিশ্চিত করতে চান ট্রান্সিশনগুলো বৈধ, তবে আপনি AASM-এর মত একটি স্টেট মেশিন জেম ব্যবহার করতে পারেন।

এই জেমটি ইভেন্ট (যেন একটি লাইট সুইচ চাপা) এর আইডিয়ার ওপর বিল্ট যা অন্য স্টেটে ট্রান্সিশন ট্রিগার করে।

এখানে একটি উদাহরণ:

 require 'aasm' class Light include AASM aasm do state :on, :off event :switch do transitions :from => :on, :to => :off, :if => :on? transitions :from => :off, :to => :on, :if => :off? end end end 

এই ক্লাস কীভাবে ব্যবহার করবেন:

 light = Light.new p light.on? # true light.switch p light.on? # false 

এই স্টেট মেশিন ব্যবহার করে আপনি শুধু "on" স্টেটে ট্রান্সিশন করতে পারবেন যদি বর্তমান স্টেট "off" হয়। আপনি কয়েকটি কলব্যাক (before/after) ও रखতে পারেন স্পেসিফিক কোড রান করার জন্য স্টেট ট্রান্সিশনের সময়।

এই কলব্যাকগুলোতে থাকতে পারে:

  • ইমেইল পাঠানো
  • স্টেট চেঞ্জ লগ করা
  • একটি লাইভ মনিটরিং ড্যাশবোর্ড আপডেট করা

উপরন্তু, AASM-এ অপশন রয়েছে বর্তমান স্টেট ডাটাবেসে সেভ করার জন্য ActiveRecord ব্যবহার করে।

AASM জেম ভিডিও

সারসংক্ষেপ

আপনি স্টেট মেশিন, স্টেট ডিজাইন প্যাটার্ন এবং AASM জেম সম্পর্কে শিখেছেন! এখন আমার রুবি নিউজলেটার সাবস্ক্রাইব করে শিখতে থাকুন (৭০০০+ সাবস্ক্রাইবার) যাতে আপনি নতুন আর্টিকেল এবং সাবস্ক্রাইবার-এক্সক্লूसিভ রুবি টিপস মিস না করেন।

এখন এই নতুন আইডিয়া দিয়ে প্র্যাকটিস করার সময় 🙂

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


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

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

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

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