रूबी में राज्य मशीनों में महारत हासिल करना:एक व्यावहारिक मार्गदर्शिका
<पी> एक राज्य मशीन किसी चीज़ की सभी संभावित स्थितियों को पकड़ सकती है और इन राज्यों के बीच अनुमत संक्रमण। उदाहरण के लिए, एक दरवाजे के लिए राज्य मशीन में केवल दो राज्य होंगे (open और closed ) और केवल दो ट्रांज़िशन (opening और closing ). <पी> दूसरी ओर, जटिल राज्य मशीनों में उनके बीच सैकड़ों संक्रमणों के साथ कई अलग-अलग राज्य हो सकते हैं। वास्तव में, यदि आप चारों ओर देखते हैं, तो आप अपने आस-पास परिमित राज्य मशीनों को देखेंगे - जब आप किसी वेबसाइट से खरीदते हैं, वेंडिंग मशीन से क्रिस्प का एक पैकेट लेते हैं, या यहां तक कि एटीएम से पैसे निकालते हैं। <पी> इस पोस्ट में, हम देखेंगे कि रूबी में स्टेट मशीन कैसे स्थापित करें और स्टेट मशीन रत्न का उपयोग कैसे करें। विकास में राज्य मशीनें
<पी> हमें विकास में राज्य मशीन की आवश्यकता कब होती है? इसका सरल उत्तर यह है कि जब भी आप राज्य परिवर्तन के लिए कई नियमों को मॉडल करना चाहते हैं या कुछ बदलावों पर साइड-इफेक्ट करना चाहते हैं। यहां कुंजी आपके एप्लिकेशन के उन हिस्सों की पहचान करना है जो राज्य मशीन से लाभान्वित होंगे। एक अच्छा उदाहरण जो हमेशा मेरे लिए काम करता है वह Order है एक ई-कॉमर्स एप्लिकेशन के संदर्भ में। <पी> उत्पादों को ऑनलाइन बेचने वाले एक साधारण एप्लिकेशन के लिए, एक Order कई राज्यों में से एक में हो सकता है: created
processing
ready
shipped
delivered
void
<पी> आप निम्नलिखित आरेख में अनुमत बदलाव देख सकते हैं। <पी>
<पी> ऑर्डर को स्टेट मशीन के रूप में विज़ुअलाइज़ करने से हमें उत्पाद ऑर्डर करने से लेकर डिलीवरी तक के पूरे प्रवाह को स्पष्ट रूप से समझने की अनुमति मिलती है। और हमारे लिए डेवलपर्स के लिए, यह उस प्रवाह में विशेष बिंदुओं पर क्या किया जा सकता है और क्या नहीं, इस पर स्पष्ट, निर्धारित कदम उठाने में सक्षम बनाता है। <पी> जैसा कि कहा जा रहा है, एक बहुत व्यापक समस्या के लिए इसे उठाकर खरगोश के बिल से नीचे कूदना आसान है और फिर सैकड़ों राज्यों के साथ समाप्त होता है जिनके बारे में तर्क करना और उनका पालन करना मुश्किल होता है। इसलिए इसे लागू करने से पहले हमेशा अपनी प्रस्तावित राज्य मशीन के लिए एक शीर्ष-स्तरीय विचार और एक राज्य चार्ट रखें। रूबी में हमारी पहली राज्य मशीन
<पी> आइए हमारे OrderStateMachine को लागू करने का प्रयास करें रूबी के साथ. <पी> यह काफी सरल कार्यान्वयन है। राज्य मशीन में प्रत्येक संभावित संक्रमण के लिए, हम एक नई विधि परिभाषित करते हैं जो कुछ विवेक जांच करती है और संक्रमण निष्पादित करती है। <पी> उपरोक्त कार्यान्वयन के बारे में सबसे अच्छी बात यह है कि सब कुछ स्पष्ट है:कोई भी नया डेवलपर राज्य मशीन की पूरी सीमा को बहुत जल्दी समझ सकता है। <पी> आइए देखें कि हम बदलावों में कुछ दुष्प्रभाव कैसे जोड़ सकते हैं। हम स्वचालित रूप से पैक किए गए और वितरण योग्य ऑर्डर भेज देंगे: <पी> जबकि एक सरल कार्यान्वयन बहुत अच्छा काम करता है, यह अत्यधिक क्रियात्मक होता है, खासकर जब हमारे पास बहुत सारे परिवर्तन और स्थितियाँ होती हैं। <पी> रूबी टूलबॉक्स पर एक त्वरित जांच से राज्य मशीनों के लिए कई रत्न सामने आते हैं।state_machines और aasm सबसे लोकप्रिय हैं, और यदि आप उन्हें रेल के साथ उपयोग करना चाहते हैं तो दोनों एक ActiveRecord एडाप्टर के साथ आते हैं। दोनों पूरी तरह से परीक्षण किए गए हैं और उत्पादन के लिए तैयार हैं, इसलिए यदि आपको स्टेट मशीन लागू करने की आवश्यकता है तो उन्हें जांचें। रूबी में स्टेट मशीन जेम का उपयोग करना
<पी> इस पोस्ट के लिए, मैं वर्णन करूंगा कि हम अपने Order के लिए राज्य मशीन को कैसे मॉडल कर सकते हैं state_machines का उपयोग करना रत्न. <पी> उपरोक्त वर्ग हमारी सरल राज्य मशीन और उसके सभी संभावित बदलावों को परिभाषित करता है। इसके अलावा, यह स्वचालित रूप से एक ऑर्डर पर बहुत सारी उपयोगिता विधियों को भी उजागर करता है: रूबी में स्टेट मशीन जेम के साथ साइड-इफेक्ट निष्पादित करें
<पी> जैसा कि किसी भी वास्तविक दुनिया प्रणाली के लिए सामान्य है, एक राज्य मशीन में कई बदलाव दुष्प्रभाव के साथ आएंगे। state_machines रत्न उन्हें परिभाषित करना और निष्पादित करना आसान बनाता है। आइए दो दुष्प्रभाव जोड़ें: ready के सभी संक्रमणों पर , यदि ऑर्डर deliverable है तो एक डिलीवरी कंसाइनमेंट बनाएं .
- सभी
fail_delivery पर ईवेंट, उपयोगकर्ता को ईवेंट की सूचना देते हुए एक ईमेल भेजें।
<पी> हम इस क्रम में हमेशा की तरह बदलाव कर सकते हैं: <पी> मैं state_machines के लिए जीथब पृष्ठ की जांच करने का सुझाव दूंगा जेम द्वारा प्रदान किए जाने वाले सभी संभावित विकल्पों के बारे में जानने के लिए। रूबी ऑन रेल्स में ActiveRecord के साथ स्टेट मशीन्स जेम का उपयोग करें
<पी> जैसा कि पहले चर्चा की गई, दोनों 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 प्रदर्शन समस्याओं के निवारण के लिए इस पोस्ट को देखें। रैप अप:रूबी में स्टेट मशीनें बनाएं
<पी> इस पोस्ट में, हमने पता लगाया कि एक साधारण राज्य मशीन बनाने से पहले, हम विकास में राज्य मशीन का उपयोग क्यों करेंगे। अंत में, हमने रूबी और रूबी ऑन रेल्स में स्टेट मशीन रत्न का उपयोग करने पर ध्यान दिया। <पी> अब जब आपको राज्य मशीन की बुनियादी समझ हो गई है, तो मुझे यकीन है कि आप अपने आस-पास ऐसे कई परिदृश्यों को पहचानेंगे जो पहले से ही राज्य मशीन का उपयोग कर रहे हैं या किसी एक से बहुत लाभान्वित होंगे। <पी> अगली बार तक, मैं आपको राज्य मशीनें बनाने के लिए शुभकामनाएँ देता हूँ! <पी> पी.एस. यदि आप प्रेस से हटते ही रूबी मैजिक पोस्ट पढ़ना चाहते हैं, तो हमारे रूबी मैजिक न्यूज़लेटर की सदस्यता लें और एक भी पोस्ट न चूकें! पी>
पुलकित गोयल
<पी> हमारे अतिथि लेखक पुलकित एक वरिष्ठ फुल-स्टैक इंजीनियर और सलाहकार हैं। अपने खाली समय में वह अपने ब्लॉग पर अपने अनुभवों के बारे में लिखते हैं। <पी> सभी लेख पुलकित गोयल द्वारा