आइए एक अनंत लंबा निबंध लिखें! लेकिन यह एक असंभव कार्य है. हालाँकि, हम एक ऐसी प्रक्रिया बना सकते हैं, जिसे अगर हमेशा के लिए चलाया जाए, तो एक असीमित लंबा निबंध तैयार हो जाएगा। पर्याप्त नजदीक ।
अब, आप स्पष्ट रूप से पायथन कोड की एक पंक्ति के साथ एक लंबा और दोहराव वाला निबंध तैयार कर सकते हैं:
>>> "This is water. " * 20 'This is water. This is water. This is water. This is water. This is water. This is water. This is water. This is water. This is water. This is water. This is water. This is water. This is water. This is water. This is water. This is water. This is water. This is water. This is water. This is water. '
जम्हाई ... उबासी! इसके बजाय, हम इस लेख में राज्य डिज़ाइन पैटर्न का उपयोग करके एक अधिक दिलचस्प निबंध तैयार करेंगे।
सबसे पहले, हम समझेंगे कि राज्य मशीनें क्या हैं और वे राज्य डिज़ाइन पैटर्न से कैसे संबंधित हैं। इसके बाद, हम एक राज्य मशीन बनाएंगे जो एक (यथोचित) दिलचस्प और अनंत निबंध उत्पन्न कर सकती है। फिर, हम संक्षेप में राज्य डिज़ाइन पैटर्न पर विचार करेंगे। अंत में, हम स्टेट डिज़ाइन पैटर्न का उपयोग करके उस स्टेट मशीन को ऑब्जेक्ट-ओरिएंटेड कोड में अनुवाद करेंगे।
सॉफ़्टवेयर डिज़ाइन पैटर्न आम तौर पर होने वाली समस्याओं को हल करने के प्रभावी तरीके हैं। जब उचित रूप से लागू किया जाता है, तो राज्य पैटर्न जैसे सॉफ़्टवेयर डिज़ाइन पैटर्न आपको बेहतर स्केलेबल, रखरखाव योग्य और परीक्षण योग्य सॉफ़्टवेयर लिखने में मदद कर सकते हैं।
संक्षेप में, राज्य डिज़ाइन पैटर्न एक राज्य मशीन को ऑब्जेक्ट-ओरिएंटेड कोड में अनुवादित करता है।
यदि आप राज्य मशीनों से परिचित नहीं हैं, तो यह एक बहुत ही सरल अवधारणा है। एक राज्य मशीन में अवस्थाएँ और परिवर्तन होते हैं। राज्य हमारे हित की प्रणाली के कुछ गुण हैं, और राज्य परिवर्तन ऐसी क्रियाएं हैं जो इन गुणों को बदलती हैं और इस प्रकार राज्य परिवर्तन का कारण भी बनती हैं।
चूँकि मेरे पास रोबोटिक्स पृष्ठभूमि है (अन्य बातों के अलावा) और क्योंकि रोबोटिक्स में राज्य मशीनों का बड़े पैमाने पर उपयोग किया जाता है, मैं यह बताने के लिए रोबोट वैक्यूम क्लीनर का एक सरल उदाहरण उपयोग करूँगा कि राज्य मशीनें कैसे काम करती हैं।
राज्य मशीन आरेख एक सहज चित्र पेश करता है कि रोबोट कैसे संचालित होता है, भले ही आपने कभी राज्य मशीनों का सामना नहीं किया हो। आइए इस ऑपरेशन को चरण दर चरण देखें।
इस प्रकार, हमारे रोबोट वैक्यूम क्लीनर की तीन स्थितियाँ हैं - डॉक्ड , क्लीनिंग और चार्जिंग - और इसमें फर्श और उसकी बैटरी की संवेदी पहचान के आधार पर बदलाव होते हैं।
अब जब हम बुनियादी स्तर पर राज्य मशीनों को समझते हैं तो आइए एक अनंत निबंध लिखने में सक्षम राज्य मशीन बनाएं।
ऊपर एक राज्य मशीन है जो छोटे, सरल वाक्यों से युक्त निबंध तैयार करने के लिए अंग्रेजी व्याकरण का उपयोग करती है। मैं वादा करता हूं कि हम जल्द ही एक और दिलचस्प संस्करण प्राप्त करेंगे, लेकिन इसे समझने के लिए एक अच्छे शुरुआती बिंदु के रूप में काम करना चाहिए। आइए देखें कि यह कैसे काम करता है।
यह राज्य मशीन एक (निरर्थक) निबंध उत्पन्न कर सकती है जो इस तरह दिखता है।
दुनिया लाल भौंकती है! चचेरा भाई हैरी बेईमानी से बारिश करता है? बाघ मस्ती से झिलमिलाते हैं। …
हालाँकि "गैर-नियतात्मक" जटिल लगता है, हमारे उद्देश्यों के लिए, इसका मतलब बस कुछ यादृच्छिकता जोड़ना है। मूलतः हम कुछ राज्यों में परिवर्तन करने से पहले एक प्रकार का सिक्का उछालने का कार्य जोड़ रहे हैं। आप समझ जायेंगे कि मेरा क्या मतलब है।
उपरोक्त गैर-नियतात्मक राज्य मशीन पहले वाली के समान ही है। एकमात्र अंतर ये हैं:
यादृच्छिकता, निषेध और संयोजन की शुरूआत के साथ, अब हम अधिक दिलचस्प और परिवर्तनीय-लंबाई वाले वाक्य उत्पन्न कर सकते हैं।
अब, आइए समझें कि राज्य डिज़ाइन पैटर्न कैसे काम करता है। दोबारा, याद रखें कि हम एक स्टेट मशीन को ऑब्जेक्ट-ओरिएंटेड कोड में अनुवाद करने का प्रयास कर रहे हैं।
निबंध निर्माण राज्य मशीन में, ध्यान दें कि प्रत्येक राज्य को दो काम करने की आवश्यकता है।
किसी विशेष राज्य के दृष्टिकोण से, ऐसा कुछ और नहीं है जिसके बारे में उसे जानने या करने की आवश्यकता है। संपूर्ण प्रणाली की जटिलता - उसकी सभी अवस्थाओं और परिवर्तनों - में उलझने के बजाय हम एक समय में केवल एक ही स्थिति पर ध्यान केंद्रित कर सकते हैं। मेरे विचार में, इस प्रकार का अलगाव और विघटन राज्य पैटर्न का सबसे बड़ा विक्रय बिंदु है।
नीचे, हमारे पास राज्य डिज़ाइन पैटर्न के लिए एक यूएमएल आरेख है। कुछ संदर्भ हैं जिनमें प्रत्येक राज्य संचालित होता है, जिसे Context
वर्ग द्वारा दर्शाया गया है। संदर्भ ऑब्जेक्ट में एक निजी राज्य विशेषता होती है, जिसका उपयोग वह अपनी कार्रवाई करने के लिए वर्तमान स्थिति को कॉल करने के लिए करता है। प्रत्येक राज्य अपनी कार्रवाई या संचालन करने और अगले राज्य को वापस करने के तरीकों के साथ एक State
इंटरफ़ेस लागू करता है।
यदि हम इसे निबंध निर्माण उदाहरण पर मैप करते हैं, तो यूएमएल आरेख इस तरह दिखता है।
WordState
अब एक इंटरफ़ेस के बजाय एक अमूर्त वर्ग (इटैलिक द्वारा दर्शाया गया) है। सार वर्गों में कुछ अमूर्त (कार्यान्वित नहीं) विधियाँ और विशेषताएँ हो सकती हैं, जबकि अन्य को परिभाषित किया जा सकता है। इंटरफ़ेस पूरी तरह से अमूर्त हैं: उनकी सभी विधियाँ अमूर्त हैं। मैंने यह बदलाव इसलिए किया क्योंकि सभी राज्यों में generateWord
कार्यान्वयन समान है, और डुप्लिकेट कोड से बचना अच्छा है।
आइए उपरोक्त प्रत्येक विशेषता और विधि का विश्लेषण करें। EssayContext
क्लास में, हमारे पास है:
state
: वर्तमान WordState
ऑब्जेक्ट का संदर्भ।essayBody
: अब तक उत्पन्न सभी शब्दों की सूची।setState()
: state
विशेषता को बदलने के लिए सेटर।addWord()
: निबंध के मुख्य भाग में अगला शब्द जोड़ने की विधि।generateEssay()
: हम अपना निबंध तैयार करने के लिए इस विधि को कहते हैं; जब essayBody
लंबाई length
से अधिक हो तो हम रुक जाते हैं।printEssay()
: जेनरेट किए गए निबंध की एक स्ट्रिंग लौटाता है।
अमूर्त वर्ग WordState
में, हमारे पास है:
wordList
: शब्दों की एक सूची के लिए सार संपत्ति (इटैलिक द्वारा इंगित) जिसमें से हम उत्पन्न करने के लिए शब्द चुनते हैं।generateWord()
: वह विधि जो निबंध के संदर्भ में उत्पन्न शब्द जोड़ती है।nextState()
: अगली स्थिति वापस करने के लिए सार विधि।
हम WordState
से प्राप्त अन्य सभी ठोस अवस्थाओं के लिए एक प्रतिनिधि उदाहरण के रूप में NounState
उपयोग करेंगे।
wordList
: संज्ञाओं की एक सूची जिसमें से हम उत्पन्न करने के लिए शब्द चुनते हैं।nextState()
: अगला राज्य लौटाता है।
अब, हमारे पास वास्तव में इसे कोड में लागू करने के लिए आवश्यक सब कुछ है। आइए आगे बढ़ें और ऐसा ही करें!
आइए सबसे पहले EssayContext
क्लास को essay_context.py
नामक फ़ाइल में लिखें। हम ऊँट का मामला छोड़ देंगे और साँप का मामला अपनाएँगे क्योंकि, ठीक है, अजगर एक... साँप है (क्षमा करें)।
from word_state import WordState class EssayContext: def __init__(self, state: WordState): self.state = state self.essay_body: list[str] = [] def set_state(self, state: WordState): self.state = state def add_word(self, word: str): self.essay_body.append(word) def generate_essay(self, length: int): while len(self.essay_body) < length: self.state.generate_word(self) def print_essay(self) -> str: return " ".join(self.essay_body)
फिर, आइए word_state.py
नामक फ़ाइल में स्थितियाँ जोड़ें।
import abc import numpy as np class WordState(abc.ABC): word_list: list[str] @classmethod def generate_word(cls, context: "EssayContext"): word = np.random.choice(cls.word_list) context.add_word(word) context.set_state(cls.next_state()) @classmethod @abc.abstractmethod def next_state(cls) -> "WordState": pass class NounState(WordState): word_list: list[str] = ["everything", "nothing"] @classmethod def next_state(cls): return VerbState class VerbState(WordState): word_list: list[str] = ["is", "was", "will be"] @classmethod def next_state(cls): heads = np.random.rand() < 0.5 if heads: return NegationState return AdjectiveState class NegationState(WordState): word_list: list[str] = ["not"] @classmethod def next_state(cls): return AdjectiveState class AdjectiveState(WordState): word_list: list[str] = ["fantastic", "terrible"] @classmethod def next_state(cls): heads = np.random.rand() < 0.5 if heads: return ConjunctionState return EndmarkState class ConjunctionState(WordState): word_list: list[str] = ["and", "but"] @classmethod def next_state(cls): return NounState class EndmarkState(WordState): word_list: list[str] = [".", "!"] @classmethod def next_state(cls): return NounState
अंत में, आइए main.py
में सब कुछ चलाने के लिए कोड जोड़ें।
from essay_context import EssayContext from word_state import NounState if __name__ == '__main__': ctx = EssayContext(NounState) ctx.generate_essay(100) print(ctx.print_essay())
python main.py
चलाने से हमें निम्नलिखित आउटपुट मिलता है (गैर-नियतिवाद के कारण हर बार अलग):
'everything is not terrible and nothing was terrible ! everything will be not fantastic but everything is fantastic . everything will be fantastic . nothing will be fantastic and nothing will be terrible ! everything was not fantastic and everything will be not terrible . everything was terrible . nothing was terrible but nothing will be fantastic ! nothing is not terrible . nothing was not fantastic but everything was not fantastic ! everything will be not fantastic but everything will be terrible ! everything will be not fantastic . everything is fantastic but nothing will be not terrible ! everything will be not fantastic but nothing was not fantastic !'
ऐसी सरल प्रणाली के लिए बुरा नहीं है! निबंध निर्माण को और अधिक परिष्कृत बनाने के लिए हम विभिन्न शब्द सूचियों का विस्तार भी कर सकते हैं या अधिक राज्य जोड़ सकते हैं। हम अपने निबंधों को अगले स्तर पर ले जाने के लिए कुछ एलएलएम एपीआई भी पेश कर सकते हैं।
राज्य मशीनें और राज्य पैटर्न "राज्य" की अच्छी तरह से परिभाषित धारणा के साथ मॉडल बनाने और सिस्टम बनाने के लिए बहुत उपयुक्त हैं। अर्थात्, प्रत्येक राज्य के साथ विशिष्ट व्यवहार और गुण जुड़े होते हैं। रोबोट वैक्यूम क्लीनर सफाई कर रहा है, डॉक कर रहा है या चार्ज कर रहा है। आपका टीवी चालू या बंद हो सकता है, और टीवी रिमोट बटन टीवी की स्थिति के आधार पर अलग-अलग कार्य करेंगे।
यह एक अच्छी तरह से परिभाषित पैटर्न के साथ अनुक्रम उत्पन्न करने या पहचानने के लिए भी उपयुक्त है। यह हमारे निबंध पीढ़ी के उदाहरण पर लागू होता है।
अंत में, आप पूछ सकते हैं, "इस सबका मतलब क्या है?" इस "अनंत" निबंध को उत्पन्न करने के लिए हमें विभिन्न राज्यों और वर्गों को परिभाषित करने में इतनी परेशानी क्यों उठानी पड़ी? समान व्यवहार प्राप्त करने के लिए हम पायथन कोड की 20 (या उससे कम) पंक्तियाँ लिख सकते थे।
संक्षिप्त उत्तर बेहतर स्केलेबिलिटी के लिए है।
कल्पना कीजिए, यदि केवल तीन या पाँच राज्यों के बजाय, हमारे पास 50 या 500 राज्य होते। यह अतिशयोक्ति नहीं है; वास्तविक उद्यम प्रणालियों में जटिलता का वह स्तर होता है। अचानक, राज्य पैटर्न अपने विघटन और अलगाव के कारण अधिक आकर्षक लगता है। हम पूरे सिस्टम को अपने दिमाग में रखे बिना एक समय में केवल एक राज्य पर ध्यान केंद्रित कर सकते हैं। परिवर्तन लाना आसान है क्योंकि एक राज्य दूसरे को प्रभावित नहीं करेगा। यह आसान इकाई परीक्षण की भी अनुमति देता है, जो एक स्केलेबल और रखरखाव योग्य प्रणाली का एक बड़ा हिस्सा है।
अंततः, राज्य पैटर्न केवल राज्यों के प्रबंधन के बारे में नहीं है; सभी डिज़ाइन पैटर्न की तरह, यह बिल्डिंग सिस्टम के लिए एक खाका है जो परिष्कृत होने के साथ-साथ स्केलेबल और रखरखाव योग्य भी है।