আজ আপনি রাষ্ট্রীয় মেশিন সম্পর্কে শিখবেন, তারা কীভাবে কাজ করে এবং কীভাবে AASM রত্ন দিয়ে আপনার রুবি প্রকল্পে সেগুলি ব্যবহার করবেন।
এখন :
একটি ট্রাফিক লাইট কল্পনা করুন...
এটি লাল, সবুজ বা হলুদ হতে পারে।
যখন এটি রং পরিবর্তন করে, তখন পরবর্তী রঙ বর্তমান এর উপর ভিত্তি করে একটি।
ধরা যাক যে এটি এমন একটি যা অন্ধ ব্যক্তিদের জন্য শব্দ করে যাতে তারা জানতে পারে কখন তারা অতিক্রম করতে পারে।
এখন :
আপনি এই জিনিসটির জন্য সফ্টওয়্যারটি লিখছেন।
প্রতিবার কোন শব্দ বাজাতে হবে এবং তার পরের রঙ কী হবে তা আপনি কীভাবে জানবেন?
আপনি কিছু লিখতে পারেন যদি এই ধরনের বিবৃতি হয়:
যদি @light.state =="সবুজ" @light.play_green_soundendif @light.state =="সবুজ" @light.change_to_yellowend# ...
এই রাজ্য চেকিং কোড সমস্ত জায়গায় থাকবে!
আমরা কিভাবে এটি উন্নত করতে পারি?
আপনি যদি অবজেক্ট-ওরিয়েন্টেড ডিজাইন নীতিগুলি প্রয়োগ করেন তবে আপনি স্টেট ডিজাইন প্যাটার্ন পুনরায় আবিষ্কার করবেন।
স্টেট ডিজাইন প্যাটার্ন কি?
স্টেট ডিজাইন প্যাটার্ন হল একটি স্টেট মেশিন বাস্তবায়নের এক উপায়।
আপনার ৩টি উপাদানের প্রয়োজন হবে :
- একটি
Context
ক্লাস, এই শ্রেণী জানে বর্তমান অবস্থা কি - A
State
class, এই ক্লাস পদ্ধতিগুলিকে সংজ্ঞায়িত করে যা পৃথক রাজ্যগুলি দ্বারা প্রয়োগ করা উচিত - প্রতিটি রাজ্যের জন্য একটি ক্লাস। এই ক্লাসগুলি
State
থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হবে ক্লাস
আমাদের ট্রাফিক লাইট উদাহরণে, প্রসঙ্গ হল TrafficLight
নিজেই।
এবং রাজ্যগুলি হল Green
, Red
&Yellow
.
প্রতিটি রাজ্য কি করতে হবে তা জানবে।
বড় সুবিধা ?
প্রতিটি রাজ্য নিজেকে জানে তাই বর্তমান অবস্থা পরীক্ষা করার প্রয়োজন নেই। এটি কম শর্তসাপেক্ষ বিবৃতিতে অনুবাদ করে যা প্রায়শই জটিলতার উৎস।
ট্রাফিক লাইট বাস্তবায়ন
আসুন এই প্যাটার্নের একটি বাস্তব বাস্তবায়নের জন্য কোডটি দেখি।
এখানে TrafficLight
:
শ্রেণি ট্রাফিকলাইট ডিফ ইনিশিয়ালাইজ @state =শূন্য শেষ def next_state(klass =Green) @state =klass.new(self) @state.beep @state.start_timer শেষ
এখানে বেস State
:
ক্লাস স্টেট ডিফ ইনিশিয়ালাইজ(আলো) @light =লাইট এন্ড ডিফ বিপ এন্ড ডিফ নেক্সট_স্টেট এন্ড ডিফ স্টার্ট_টাইমার এন্ডএন্ড
হ্যাঁ, এই ৩টি পদ্ধতি খালি৷
৷এই "ইন্টারফেস" সংজ্ঞায়িত করার জন্য অন্যান্য প্রোগ্রামিং ভাষায় (যেমন জাভা) এটি একটি সাধারণ প্রথা, কিন্তু এটি রুবিতে জনপ্রিয় নয়৷
এটি এখানে প্রদর্শনের উদ্দেশ্যে।
যাইহোক, আমরা এখনও initialize
শেয়ার করতে চাই সমস্ত রাজ্যের মধ্যে পদ্ধতি কারণ তাদের সকলের প্রসঙ্গ প্রয়োজন (TrafficLight
বস্তু) একটি রাষ্ট্র পরিবর্তন সংকেত দিতে .
এখন :
3টি রাজ্য একে অপরের সাথে খুব মিল দেখায়, তাই আমি আপনাকে তাদের মধ্যে একটির কোড দেখাতে যাচ্ছি।
এখানে Green
রাজ্য:
শ্রেণীর সবুজপ্রতিটি রাজ্য জানে কিভাবে এবং কখন পরবর্তীতে সুইচ করতে হবে।
AI গেমের উদাহরণ
আপনি একটি স্টেট মেশিন ব্যবহার করতে পারেন গেমগুলি সমাধান করতে যা বর্তমান অবস্থার উপর নির্ভর করে, যেমন RubyWarrior.
RubyWarrior-এ আপনাকে একটি প্লেয়ার অবজেক্ট এবং একটি বোর্ড দেওয়া হয়েছে।
লক্ষ্যগুলি হল৷ :
- বোর্ডে সমস্ত শত্রুদের পরাজিত করুন
- আপনার HP 0-এর উপরে রেখে প্রস্থান করুন
আপনি একবারে একটি পদক্ষেপ করতে পারেন এবং আপনি যদি স্তরটি সম্পূর্ণ করতে চান তবে আপনাকে একটি ভাল পছন্দ করতে হবে৷
বর্তমান অবস্থার দিকে তাকিয়ে আপনাকে সেই পছন্দ করতে সাহায্য করে৷
৷এই কারণেই একটি রাষ্ট্রীয় মেশিন একটি ভাল সমাধান৷
৷এখানে একটি উদাহরণ :
<প্রি>ক্লাস অ্যাটাকিং <স্টেট ডিফ প্লে(যোদ্ধা) ওয়ারিয়র. অ্যাটাক! @player.set_state(হিলিং) যদি না শত্রু_ খুঁজে পাওয়া যায়?(যোদ্ধা) শেষ হয়
এটি এমন একটি রাজ্য যেখানে আমাদের যোদ্ধা থাকতে পারে, যখন আমাদের দৃষ্টিতে কোনো শত্রু থাকে না তখন আমরা Healing
-এ চলে যাই যুদ্ধের ক্ষয়ক্ষতি থেকে পুনরুদ্ধার করতে রাষ্ট্র।
AASM রত্ন ব্যবহার করা
পরিবর্তনগুলি বৈধ কিনা তা নিশ্চিত করার সময় আপনি যদি বর্তমান অবস্থার ট্র্যাক রাখতে চান তবে আপনি AASM এর মতো একটি রাষ্ট্রীয় যন্ত্র ব্যবহার করতে পারেন৷
এই রত্নটি ইভেন্টের ধারণাকে ঘিরে তৈরি করা হয়েছে (যেমন একটি আলোর সুইচ টিপে) যা অন্য রাজ্যে রূপান্তরকে ট্রিগার করে।
এখানে একটি উদাহরণ :
'aasm'class Light এর মধ্যে AASM aasm do state :on, :off ইভেন্ট :সুইচ ডু ট্রানজিশন :from => :on, :to => :off, :if => :on? ট্রানজিশন :from => :off, :to => :on, :if => :off? শেষ শেষ
কিভাবে এই ক্লাসটি ব্যবহার করবেন :
light =Light.newp light.on?# truelight.switchp light.on?# false
এই স্টেট মেশিন ব্যবহার করে আপনি শুধুমাত্র "চালু" অবস্থায় স্থানান্তর করতে পারবেন যদি বর্তমান অবস্থা "বন্ধ" থাকে। রাজ্য পরিবর্তনের সময় নির্দিষ্ট কোড চালানোর জন্য আপনার কাছে অনেকগুলি কলব্যাক (আগে/পরে) থাকতে পারে।
এই কলব্যাক এই ধরনের জিনিস অন্তর্ভুক্ত করতে পারে:
- একটি ইমেল পাঠানো হচ্ছে
- রাজ্য পরিবর্তন লগিং করা হচ্ছে
- একটি লাইভ মনিটরিং ড্যাশবোর্ড আপডেট করা হচ্ছে
উপরন্তু, AASM-এর কাছে ActiveRecord
ব্যবহার করে একটি ডাটাবেসে বর্তমান অবস্থা সংরক্ষণ করার বিকল্প রয়েছে। .
AASM জেম ভিডিও
সারাংশ
আপনি রাষ্ট্রীয় মেশিন, রাষ্ট্র নকশা প্যাটার্ন এবং AASM মণি সম্পর্কে শিখেছেন! আমার রুবি নিউজলেটারে (7000+ গ্রাহক) সদস্যতা নিয়ে এখনই শিখতে থাকুন যাতে আপনি নতুন নিবন্ধ এবং গ্রাহক-এক্সক্লুসিভ রুবি টিপস মিস করবেন না .
এখন এই নতুন আইডিয়া নিয়ে অনুশীলন করার সময় 🙂
পড়ার জন্য ধন্যবাদ!