Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Ruby

रूबी में स्टेट मशीन्स में महारत हासिल करें: एक व्यावहारिक गाइड

एक स्टेट मशीन किसी चीज़ के सभी संभावित स्टेट्स और इन स्टेट्स के बीच अनुमत ट्रांज़िशन को रख सकती है। उदाहरण के लिए, एक दरवाजे के लिए स्टेट मशीन में केवल दो स्टेट्स होंगे (open और closed) और केवल दो ट्रांज़िशन (opening और closing)।

दूसरी ओर, जटिल स्टेट मशीन्स में सैकड़ों ट्रांज़िशन के साथ कई अलग-अलग स्टेट्स हो सकते हैं। वास्तव में, यदि आप चारों ओर देखें, तो आप पाएंगे कि फाइनाइट स्टेट मशीन्स आपको घेरे हुए हैं - जब आप किसी वेबसाइट से खरीदारी करते हैं, वेंडिंग मशीन से चिप्स का पैकेट लेते हैं, या यहां तक कि एटीएम से पैसे निकालते हैं।

इस पोस्ट में, हम देखेंगे कि रूबी में स्टेट मशीन कैसे सेट करें और स्टेट मशीन्स जेम का उपयोग कैसे करें।

डेवलपमेंट में स्टेट मशीन्स

डेवलपमेंट में हमें स्टेट मशीन की आवश्यकता कब होती है? सरल उत्तर है - जब भी आप स्टेट ट्रांज़िशन के लिए कई नियमों को मॉडल करना चाहते हैं या कुछ ट्रांज़िशन पर साइड-इफेक्ट्स परफॉर्म करना चाहते हैं। यहां मुख्य बात यह है कि अपने एप्लिकेशन के उन पार्ट्स की पहचान करें जो स्टेट मशीन से लाभान्वित होंगे। एक अच्छा उदाहरण जो हमेशा मेरे लिए काम करता है वह है ई-कॉमर्स एप्लिकेशन के संदर्भ में एक Order।

ऑनलाइन उत्पाद बेचने वाले एक साधारण एप्लिकेशन के लिए, एक Order कई स्टेट्स में से एक में हो सकता है:

  • created
  • processing
  • ready
  • shipped
  • delivered
  • void

आप निम्न आरेख में अनुमत ट्रांज़िशन देख सकते हैं।

रूबी में स्टेट मशीन्स में महारत हासिल करें: एक व्यावहारिक गाइड

ऑर्डर को स्टेट मशीन के रूप में विजुअलाइज़ करना हमें तुरंत पूरे फ्लो को स्पष्ट रूप से समझने की अनुमति देता है, उत्पाद ऑर्डर करने से लेकर डिलीवरी तक। और हमारे लिए डेवलपर्स के लिए, यह उस फ्लो में विशेष बिंदुओं पर क्या किया जा सकता है और क्या नहीं, इस पर स्पष्ट, निर्धारित चरणों को सक्षम करता है।

कहा जा रहा है, एक बहुत व्यापक समस्या के लिए इसे चुनकर रैबिट होल में कूदना आसान है और फिर सैकड़ों स्टेट्स के साथ समाप्त होता है जिनके बारे में तर्क करना और फॉलो करना मुश्किल होता है। इसलिए इसे इम्प्लीमेंट करने से पहले अपने प्रस्तावित स्टेट मशीन के लिए हमेशा एक टॉप-लेवल विचार और स्टेट चार्ट रखें।

रूबी में हमारी पहली स्टेट मशीन

आइए रूबी के साथ अपना OrderStateMachine इम्प्लीमेंट करने का प्रयास करें।



यह काफी सरल इम्प्लीमेंटेशन है। स्टेट मशीन में प्रत्येक संभावित ट्रांज़िशन के लिए, हम एक नया मेथड परिभाषित करते हैं जो कुछ सैनिटी चेक करता है और ट्रांज़िशन परफॉर्म करता है।

उपरोक्त इम्प्लीमेंटेशन की बड़ी बात यह है कि सब कुछ स्पष्ट है: कोई भी नया डेवलपर स्टेट मशीन की पूरी सीमा को बहुत जल्दी समझ सकता है।

आइए देखें कि हम ट्रांज़िशन में कुछ साइड-इफेक्ट्स कैसे जोड़ सकते हैं। हम उन ऑर्डर्स को ऑटोमैटिकली शिप करेंगे जो पैक हैं और डिलीवरेबल हैं:



जबकि एक भोला इम्प्लीमेंटेशन बहुत अच्छा काम करता है, यह अत्यधिक वर्बोज़ है, खासकर जब हमारे पास बहुत सारे ट्रांज़िशन और शर्तें होती हैं।

रूबी टूलबॉक्स पर एक त्वरित जांच स्टेट मशीन्स के लिए कई जेम्स लाती है। state_machines और aasm सबसे लोकप्रिय हैं, और दोनों एक ActiveRecord एडाप्टर के साथ आते हैं यदि आप उन्हें रेल्स के साथ उपयोग करना चाहते हैं। दोनों अच्छी तरह से टेस्टेड और प्रोडक्शन-रेडी हैं, इसलिए यदि आपको स्टेट मशीन इम्प्लीमेंट करने की आवश्यकता है तो उन्हें अवश्य देखें।

रूबी में स्टेट मशीन्स जेम का उपयोग करना

इस पोस्ट के लिए, मैं वर्णन करूंगा कि हम state_machines जेम का उपयोग करके अपने Order के लिए स्टेट मशीन को कैसे मॉडल कर सकते हैं।



उपरोक्त क्लास हमारी सरल स्टेट मशीन और इसके सभी संभावित ट्रांज़िशन को परिभाषित करती है। इसके अलावा, यह ऑर्डर पर बहुत सारी यूटिलिटी मेथड्स को ऑटोमैटिकली एक्सपोज़ करती है:



रूबी में स्टेट मशीन्स जेम के साथ साइड-इफेक्ट्स निष्पादित करें

किसी भी वास्तविक-विश्व प्रणाली के लिए हमेशा की तरह, स्टेट मशीन में कई ट्रांज़िशन साइड-इफेक्ट्स के साथ आएंगे। state_machines जेम उन्हें परिभाषित करना और निष्पादित करना आसान बनाता है। आइए दो साइड-इफेक्ट्स जोड़ें:

  1. ready पर सभी ट्रांज़िशन पर, यदि ऑर्डर deliverable है तो एक डिलीवरी कंसाइनमेंट बनाएं।
  2. सभी fail_delivery इवेंट्स पर, यूजर को इवेंट के बारे में सूचित करने के लिए एक ईमेल भेजें।


हम ऑर्डर में हमेशा की तरह ट्रांज़िशन परफॉर्म कर सकते हैं:



मैं state_machines जेम के GitHub पेज को देखने का सुझाव दूंगा ताकि जेम द्वारा प्रदान किए जाने वाले सभी संभावित विकल्पों के बारे में जान सकें।

रूबी ऑन रेल्स में ActiveRecord के साथ स्टेट मशीन्स जेम का उपयोग करें

जैसा कि पहले चर्चा की गई है, दोनों state_machines और aasm ActiveRecord को सपोर्ट करते हैं। जब आप state_machines जेम को ActiveRecord के साथ उपयोग करते हैं, तो इम्प्लीमेंटेशन के साथ बहुत सी चीजें नहीं बदलती हैं। आप इस पोस्ट के पिछले सेक्शन में चर्चा की गई अधिकांश चीजों का उपयोग जारी रख सकते हैं।

यहां कुछ अतिरिक्त विशेषताएं हैं जो आपको मिलती हैं:

  1. साइड-इफेक्ट्स एक ट्रांज़ैक्शन के अंदर होते हैं। इसका मतलब है कि यदि आप ट्रांज़िशन हुक के अंदर कुछ डेटाबेस ऑपरेशन करते हैं और ट्रांज़ैक्शन विफल हो जाता है, तो स्टेट चेंज कमिट नहीं होगा। यदि आप इस व्यवहार को अक्षम करना चाहते हैं तो use_transactions देखें।
  2. सभी अन्य ActiveRecord कॉलबैक्स की तरह, यदि आप ट्रांज़िशन से वर्तमान मॉडल के एट्रिब्यूट्स को अपडेट करना चाहते हैं, तो आपको इसे before_transition कॉलबैक के अंदर करना होगा। after_transition के अंदर एट्रिब्यूट्स अपडेट करने के लिए, आपको मॉडल को फिर से सेव करना होगा। निम्न उदाहरण देखें:

  1. जेम मॉडल्स को उनकी स्टेट के अनुसार फ़िल्टर करने के लिए स्कोप्स ऑटोमैटिकली प्रदान करता है। उदाहरण के लिए, आप सभी प्रोसेसिंग ऑर्डर्स को खोजने के लिए Order.with_state(:processing) कर सकते हैं या उन सभी ऑर्डर्स को खोजने के लिए Order.without_state(:processing) जो प्रोसेसिंग में नहीं हैं।
  2. यदि मिलान वाले ट्रांज़िशन के बिना स्टेट चेंज का प्रयास किया जाता है (उदाहरण के लिए, processing से delivered), तो रिकॉर्ड सेव होने में विफल होगा, और एक एरर वैलिडेशन एरर्स में जोड़ दी जाएगी। जनरेटेड एरर मैसेजेस को इंटरनेशनलाइज़ करने के लिए, बस कॉन्फिग फाइल्स (उदाहरण के लिए, en.yml) में स्टेट्स और इवेंट्स के लिए ट्रांसलेशन प्रदान करने के लिए कुछ कीज़ जोड़ें:


साइड नोट: ActiveRecord परफॉरमेंस मुद्दों के निवारण के लिए इस पोस्ट को देखें।

समापन: रूबी में स्टेट मशीन्स बनाएं

इस पोस्ट में, हमने डेवलपमेंट में स्टेट मशीन का उपयोग क्यों करेंगे, इसका पता लगाया, एक सरल स्टेट मशीन बनाने से पहले। अंत में, हमने रूबी और रूबी ऑन रेल्स में स्टेट मशीन्स जेम का उपयोग करने पर ध्यान दिया।

अब जब आपको स्टेट मशीन की बुनियादी समझ है, तो मुझे यकीन है कि आप अपने आसपास कई परिदृश्यों को पहचानेंगे जो पहले से ही स्टेट मशीन का उपयोग करते हैं या एक से बहुत लाभान्वित होंगे।

अगली बार तक, मैं आपको स्टेट मशीन्स बनाने के लिए शुभकामनाएं देता हूं!

P.S. यदि आप रूबी मैजिक पोस्ट्स को प्रेस से निकलते ही पढ़ना चाहते हैं, तो हमारे रूबी मैजिक न्यूजलेटर को सब्सक्राइब करें और कभी भी एक भी पोस्ट मिस न करें!

रूबी में स्टेट मशीन्स में महारत हासिल करें: एक व्यावहारिक गाइड

पुलकित गोयल

हमारे गेस्ट ऑथर पुलकित एक सीनियर फुल-स्टैक इंजीनियर और कंसल्टेंट हैं। अपने खाली समय में, वह अपने ब्लॉग पर अपने अनुभवों के बारे में लिखते हैं।

पुलकित गोयल के सभी लेख


  1. Matplotlib का उपयोग करके Seaborn बार प्लॉट में एरर बार कैसे बंद करें? Matplotlib का उपयोग करके Seaborn बार प्लॉट में एरर बार कैसे बंद करें?

    Seaborn बार प्लॉट में एरर बार बंद करने के लिए, हम निम्नलिखित चरण अपना सकते हैं: ऑनलाइन रिपॉजिटरी से एक उदाहरण डेटासेट लोड करें (इंटरनेट की आवश्यकता)। बार के साथ पॉइंट एस्टीमेट्स और कॉन्फिडेंस इंटरवल दिखाएं। फिगर डिस्प्ले करने के लिए show() मेथड का उपयोग करें। उदाहरण import seaborn as sns imp

  1. Matplotlib में Matlab के surf(x,y,z,c) के समकक्ष क्या है? Matplotlib में Matlab के surf(x,y,z,c) के समकक्ष क्या है?

    आइए एक उदाहरण देखें कि Matplotlib में MatLab के surf(x,y,z,c) का वही प्रभाव कैसे प्राप्त करें। चरण फिगर साइज सेट करें और सबप्लॉट्स के बीच और आसपास पैडिंग एडजस्ट करें। एक नया फिगर बनाएं या मौजूदा फिगर को एक्टिवेट करें। सबप्लॉट व्यवस्था के हिस्से के रूप में फिगर में एक ax जोड़ें। Numpy का उपयोग करक

  1. Tkinter के साथ ब्राउज़ बटन बनाना Tkinter के साथ ब्राउज़ बटन बनाना

    Tkinter एप्लिकेशन में बटन बनाने के लिए, हम बटन विजेट का उपयोग कर सकते हैं। बटन का उपयोग एप्लिकेशन के रनटाइम में किसी घटना के निष्पादन को प्रोसेस करने के लिए किया जा सकता है। हम Button(parent, text, **options) कंस्ट्रक्टर को परिभाषित करके बटन बना सकते हैं। मान लीजिए हम एक ब्राउज़ बटन बनाना चाहते हैं