একটি স্টেট মেশিন কিছুর সমস্ত সম্ভাব্য অবস্থা ধরে রাখতে পারে এবং এই রাজ্যগুলির মধ্যে অনুমোদিত ট্রানজিশন। উদাহরণস্বরূপ, একটি দরজার জন্য স্টেট মেশিনে শুধুমাত্র দুটি স্টেট থাকবে (open এবং closed ) এবং মাত্র দুটি রূপান্তর (opening এবং closing )।
অন্যদিকে, জটিল স্টেট মেশিনের বিভিন্ন স্টেট থাকতে পারে যার মধ্যে শত শত ট্রানজিশন থাকে। আসলে, আপনি যদি চারপাশে তাকান, আপনি দেখতে পাবেন যে আপনার চারপাশে সীমিত স্টেট মেশিন রয়েছে — যখন আপনি কোনো ওয়েবসাইট থেকে কিনবেন, ভেন্ডিং মেশিন থেকে এক প্যাকেট ক্রিসপ পাবেন, অথবা এমনকি এটিএম থেকে টাকা তুলতে পারবেন।
এই পোস্টে, আমরা দেখব কিভাবে রুবিতে একটি স্টেট মেশিন সেট আপ করা যায় এবং স্টেট মেশিনের রত্ন ব্যবহার করা যায়।
উন্নয়নে রাষ্ট্রীয় মেশিন
কখন আমাদের উন্নয়নে রাষ্ট্রীয় যন্ত্রের প্রয়োজন হবে? সহজ উত্তর হল যখনই আপনি রাষ্ট্রীয় রূপান্তরের জন্য একাধিক নিয়ম মডেল করতে চান বা কিছু ট্রানজিশনে পার্শ্ব-প্রতিক্রিয়া সম্পাদন করতে চান৷ এখানে মূলটি হল আপনার অ্যাপ্লিকেশনের অংশগুলি সনাক্ত করা যা একটি রাষ্ট্রীয় মেশিন থেকে উপকৃত হবে৷ একটি ভাল উদাহরণ যা আমার জন্য সর্বদা কাজ করে তা হল একটি Order একটি ই-কমার্স অ্যাপ্লিকেশনের প্রেক্ষাপটে৷
অনলাইনে পণ্য বিক্রির একটি সাধারণ অ্যাপ্লিকেশনের জন্য, একটি Order একাধিক রাজ্যের একটিতে হতে পারে:
createdprocessingreadyshippeddeliveredvoid
আপনি নিম্নলিখিত ডায়াগ্রামে অনুমোদিত স্থানান্তরগুলি দেখতে পারেন৷
৷

একটি রাষ্ট্রীয় যন্ত্রের আকারে অর্ডারটি অবিলম্বে ভিজ্যুয়ালাইজ করা আমাদের পণ্যের অর্ডার দেওয়া থেকে ডেলিভারি পর্যন্ত সম্পূর্ণ প্রবাহকে স্পষ্টভাবে বুঝতে দেয়৷ এবং আমাদের বিকাশকারীদের জন্য, এটি সেই প্রবাহের নির্দিষ্ট পয়েন্টগুলিতে কী করা যেতে পারে এবং কী করা যাবে না সে সম্পর্কে স্পষ্ট, সেট পদক্ষেপগুলি সক্ষম করে৷
বলা হচ্ছে, এটি একটি খুব বিস্তৃত সমস্যার জন্য এটিকে বাছাই করে একটি খরগোশের গর্তে লাফ দেওয়া সহজ এবং তারপরে এমন শত শত রাজ্যের সাথে শেষ করা যা সম্পর্কে যুক্তি দেওয়া এবং অনুসরণ করা কঠিন৷ তাই এটি বাস্তবায়ন করার আগে সর্বদা আপনার প্রস্তাবিত রাষ্ট্রীয় মেশিনের জন্য একটি শীর্ষ-স্তরের ধারণা এবং একটি রাজ্য চার্ট রাখুন৷
রুবিতে আমাদের প্রথম স্টেট মেশিন
আসুন আমাদের OrderStateMachine বাস্তবায়ন করার চেষ্টা করি রুবির সাথে।
এটি একটি সহজ যথেষ্ট বাস্তবায়ন। স্টেট মেশিনে প্রতিটি সম্ভাব্য ট্রানজিশনের জন্য, আমরা একটি নতুন পদ্ধতি সংজ্ঞায়িত করি যা কিছু বিচক্ষণতা পরীক্ষা করে এবং রূপান্তরটি সম্পাদন করে।
উপরোক্ত বাস্তবায়ন সম্পর্কে দুর্দান্ত জিনিস হল যে সবকিছুই স্পষ্ট:যে কোনও নতুন বিকাশকারী খুব দ্রুত স্টেট মেশিনের সম্পূর্ণ পরিমাণ বুঝতে পারে।
আসুন দেখি কিভাবে আমরা ট্রানজিশনে কিছু পার্শ্ব-প্রতিক্রিয়া যোগ করতে পারি৷ আমরা স্বয়ংক্রিয়ভাবে অর্ডারগুলি পাঠাব যা প্যাক করা এবং বিতরণযোগ্য:
যদিও একটি নির্বোধ বাস্তবায়ন দুর্দান্ত কাজ করে, এটি অত্যধিক শব্দপূর্ণ, বিশেষ করে যখন আমাদের অনেকগুলি পরিবর্তন এবং শর্ত থাকে৷
রুবি টুলবক্সে একটি দ্রুত চেক রাষ্ট্রীয় মেশিনের জন্য বিভিন্ন রত্ন নিয়ে আসে।state_machines এবং aasm সর্বাধিক জনপ্রিয়, এবং উভয়ই একটি ActiveRecord অ্যাডাপ্টারের সাথে আসে যদি আপনি সেগুলিকে Rails এর সাথে ব্যবহার করতে চান৷ উভয়ই পুঙ্খানুপুঙ্খভাবে পরীক্ষিত এবং উত্পাদন-প্রস্তুত, তাই আপনার একটি রাষ্ট্রীয় মেশিন প্রয়োগ করার প্রয়োজন হলে সেগুলি পরীক্ষা করে দেখুন৷
রুবিতে স্টেট মেশিন রত্ন ব্যবহার করা
এই পোস্টের জন্য, আমি বর্ণনা করব কিভাবে আমরা আমাদের Order এর জন্য স্টেট মেশিনের মডেল করতে পারি state_machines ব্যবহার করে মণি।
উপরের শ্রেণীটি আমাদের সাধারণ স্টেট মেশিন এবং এর সম্ভাব্য সমস্ত রূপান্তরকে সংজ্ঞায়িত করে৷ এর উপরে, এটি একটি অর্ডারে স্বয়ংক্রিয়ভাবে অনেকগুলি ইউটিলিটি পদ্ধতি প্রকাশ করে:
রুবিতে স্টেট মেশিন রত্ন দিয়ে পার্শ্ব-প্রতিক্রিয়া সম্পাদন করুন
যেকোনো বাস্তব-বিশ্বের সিস্টেমের জন্য স্বাভাবিক হিসাবে, একটি রাষ্ট্রীয় মেশিনে অনেকগুলি পরিবর্তন পার্শ্ব-প্রতিক্রিয়া সহ আসবে৷ state_machines রত্ন তাদের সংজ্ঞায়িত করা এবং কার্যকর করা সহজ করে। আসুন দুটি পার্শ্ব-প্রতিক্রিয়া যোগ করুন:
-
ready-এ সমস্ত ট্রানজিশনে অর্ডারdeliverableহলে একটি ডেলিভারি চালান তৈরি করুন . - সমস্ত
fail_delivery-এ ইভেন্ট, ব্যবহারকারীকে ইভেন্ট সম্পর্কে অবহিত করে একটি ইমেল পাঠান।
আমরা যথারীতি ক্রমানুসারে রূপান্তর করতে পারি:
আমি state_machines এর জন্য Github পৃষ্ঠাটি পরীক্ষা করার পরামর্শ দেব রত্ন অফার করে সমস্ত সম্ভাব্য বিকল্প সম্পর্কে জানতে মণি।
রুবি অন রেলে অ্যাক্টিভ রেকর্ড সহ স্টেট মেশিন রত্ন ব্যবহার করুন
যেমন আগে আলোচনা করা হয়েছে, উভয়ই state_machines এবং aasm ActiveRecord সমর্থন করুন। যখন আপনি state_machines ব্যবহার করেন ActiveRecord এর সাথে রত্ন, বাস্তবায়নের সাথে অনেক কিছুই পরিবর্তন হয় না। আমরা এই পোস্টের পূর্ববর্তী বিভাগে যা আলোচনা করেছি তার বেশিরভাগই আপনি ব্যবহার চালিয়ে যেতে পারেন।
এখানে কিছু অতিরিক্ত বৈশিষ্ট্য রয়েছে যা আপনি পাবেন:
- একটি লেনদেনের মধ্যে পার্শ্ব-প্রতিক্রিয়া ঘটে। এর মানে হল যে আপনি যদি ট্রানজিশন হুকের ভিতরে কিছু ডাটাবেস ক্রিয়াকলাপ করেন এবং লেনদেন ব্যর্থ হয়, তাহলে রাষ্ট্রীয় পরিবর্তন প্রতিশ্রুতিবদ্ধ হবে না।
use_transactionsদেখুন আপনি যদি এই আচরণটি নিষ্ক্রিয় করতে চান। - অন্যান্য সমস্ত ActiveRecord কলব্যাকের মতো, আপনি যদি একটি ট্রানজিশন থেকে বর্তমান মডেলের বৈশিষ্ট্যগুলি আপডেট করতে চান তবে আপনাকে এটি একটি
before_transitionএর মধ্যে করতে হবে কলব্যাক৷after_transition-এর মধ্যে বৈশিষ্ট্যগুলি আপডেট করতে৷ , আপনাকে আবার মডেলটি সংরক্ষণ করতে হবে৷ নিম্নলিখিত উদাহরণটি দেখুন:
৷
- মণিটি স্বয়ংক্রিয়ভাবে মডেলগুলিকে তাদের অবস্থা অনুসারে ফিল্টার করার সুযোগ প্রদান করে৷ উদাহরণস্বরূপ, আপনি
Order.with_state(:processing)করতে পারেন সমস্ত প্রক্রিয়াকরণ আদেশ বাOrder.without_state(:processing)খুঁজতে প্রক্রিয়াধীন নয় এমন সমস্ত অর্ডার খুঁজে পেতে। - যদি একটি সামঞ্জস্যপূর্ণ স্থানান্তর ছাড়াই একটি রাষ্ট্র পরিবর্তনের চেষ্টা করা হয় (উদাহরণস্বরূপ,
processingথেকেdelivered-এ ), রেকর্ড সংরক্ষণ করতে ব্যর্থ হবে, এবং যাচাইকরণ ত্রুটিতে একটি ত্রুটি যোগ করা হবে৷ উৎপন্ন ত্রুটি বার্তাগুলিকে আন্তর্জাতিকীকরণ করতে, কনফিগার ফাইলগুলির মধ্যে রাজ্য এবং ইভেন্টগুলির জন্য অনুবাদ প্রদান করতে কিছু কী যোগ করুন (উদাহরণস্বরূপ,en.yml):
সাইড নোট :ActiveRecord পারফরম্যান্স সমস্যা সমাধানের জন্য এই পোস্টটি দেখুন৷
র্যাপ আপ:রুবিতে স্টেট মেশিন তৈরি করুন
এই পোস্টে, আমরা একটি সাধারণ রাষ্ট্রীয় মেশিন তৈরি করার আগে কেন আমরা উন্নয়নে একটি রাষ্ট্রীয় মেশিন ব্যবহার করব তা অনুসন্ধান করেছি। অবশেষে, আমরা রুবি এবং রুবি অন রেলে স্টেট মেশিন রত্ন ব্যবহার করার দিকে নজর দিলাম।
এখন যেহেতু আপনি একটি রাষ্ট্রীয় যন্ত্র সম্পর্কে প্রাথমিক ধারণা পেয়েছেন, আমি নিশ্চিত যে আপনি আপনার চারপাশে এমন বেশ কয়েকটি পরিস্থিতি চিনতে পারবেন যেগুলি ইতিমধ্যেই একটি রাষ্ট্রীয় যন্ত্র ব্যবহার করে বা একটি থেকে অনেক উপকৃত হবে৷
পরের বার পর্যন্ত, রাষ্ট্রীয় যন্ত্র নির্মাণের জন্য আমি আপনার সৌভাগ্য কামনা করছি!
পি.এস. আপনি যদি রুবি ম্যাজিক পোস্টগুলি প্রেস থেকে বের হওয়ার সাথে সাথে পড়তে চান তবে আমাদের রুবি ম্যাজিক নিউজলেটারে সাবস্ক্রাইব করুন এবং একটি পোস্ট মিস করবেন না!
পুলকিত গয়াল
আমাদের অতিথি লেখক পুলকিত একজন সিনিয়র ফুল-স্ট্যাক ইঞ্জিনিয়ার এবং পরামর্শদাতা। তার অবসর সময়ে, তিনি তার ব্লগে তার অভিজ্ঞতার কথা লেখেন।
পুলকিত গোয়ালের সমস্ত নিবন্ধ