2010-02-02 10 views
8

क्या परिमित राज्य मशीनें आम तौर पर ओओपी में खराब डिजाइन के रूप में मानी जाती हैं?परिष्कृत राज्य मशीन: खराब डिजाइन?

मैं इसे बहुत कुछ सुनता हूं। और, मुझे इसका उपयोग करने के बाद, वास्तव में पुराने, अनियंत्रित टुकड़े का उपयोग करने के बाद सी ++ का उपयोग करना पड़ा, मैं सहमत हूं। डीबग करने के लिए यह दर्द था।

पठनीयता/रखरखाव संबंधी चिंताओं के बारे में क्या?

+0

संबंधित: http://stackoverflow.com/questions/1647631/c-state-machine-design – jldupont

+7

एक भक्त Pastafarian जैसा कि मैंने पहले नौकरियों में एक FSM को क्रियान्वित किया है, यहाँ एक कंकाल टेम्पलेट है , एफएसएम हमेशा अच्छा होता है;) – richo

+7

कभी भी एक संपूर्ण दृष्टिकोण को नाराज न करें क्योंकि आप इसके खराब कार्यान्वयन को देख रहे हैं। कुछ भी जो अनियंत्रित/डीबग करने के लिए कठिन है, बुरा है, लेकिन यह कार्यान्वयन खराब है। –

उत्तर

16

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

ओओपी के साथ एक को लागू करने के कई तरीके हैं। कुछ दूसरों की तुलना में उलझन में हैं। आपके निम्न-स्तरीय लोग स्विच स्टेटमेंट्स, जंप टेबल या यहां तक ​​कि "गोटो" का उपयोग करेंगे।

यदि आप इसे करने के लिए एक क्लीनर तरीका ढूंढ रहे हैं, तो मैं Boost's State Chart library की अनुशंसा करता हूं, जो कि सी ++ में यूएमएल राज्य आरेखों को लागू करने के लिए बनाया गया है। चीजों को और अधिक पठनीय बनाने के लिए, यह आधुनिक टेम्पलेट तकनीकों का उपयोग करता है। यह भी बहुत अच्छा प्रदर्शन करता है।

+4

+1 और बूस्ट लिंक जो पहले पृष्ठ पर है, रॉबर्ट सी मार्टिन द्वारा पीडीएफ के लिंक को "यूएमएल ट्यूटोरियल: फिनिट स्टेट मशीन" कहा जाता है। ओओ/राज्य मशीन में किसी के लिए क्लासिक। – SyntaxT3rr0r

+0

"कभी नहीं" एक सुंदर चरम बिंदु है। आईएमओ, परिस्थितियों का एक संकीर्ण सेट है जहां वे उचित हैं। फिर भी, मुझे अभी तक एक साफ कार्यान्वयन नहीं देखा गया है जिसके लिए सही मात्रा में उपयोग करने के लिए अनुशासन की आवश्यकता नहीं है (बूस्ट स्टेट चार्ट सहित)। – Catskul

1

मुझे लगता है कि अगर कोड अच्छी तरह से प्रलेखित है तो ओओपी दृष्टिकोण का उपयोग करके इसे लागू करने में कोई समस्या नहीं है। अधिकांश सी/सी ++ स्विच स्टेटमेंट का उपयोग करके एफएसएम को कार्यान्वित करने के लिए उपयोग करते हैं जो कभी-कभी मशीन बड़ी होने पर पठनीयता से समझौता कर सकता है।

हाल ही में मैं एक नियमित रूप से भाषा को पार्स करने की जरूरत है, और एक FSM OOP दृष्टिकोण का उपयोग कर लागू किया, कोड पठनीयता और रख-रखाव अच्छे थे। मेरा मतलब है, बड़े स्विच स्टेटमेंट का उपयोग करने से काफी बेहतर है।

एक टिप, एक प्रथम क्षण में, मैं FSM राज्यों containg और संक्रमण युक्त राज्यों क्रियान्वित किया है। हालांकि, मेरे मामले में यह वर्गों को एफएसएम का प्रतिनिधित्व करने के लिए एक बेहतर दृष्टिकोण साबित हुआ, जिसमें राज्यों का एक संग्रह और संक्रमणों में से एक था। यह मशीनों को क्लोन करने के लिए मेरे लिए आसान बना दिया (यह मेरे लिए एक आवश्यकता थी) और एक छोटा संक्रमण समारोह है।

मुझे आशा है कि यह मदद करता है, कार्लोस।

2

मैं कहूँगा कि परिमित अवस्था की मशीनों ज्यादा एक ही समस्या है (जैसे नियमित भाषाओं मिलान के रूप में समस्याओं) के हल के लिए अन्य तरीकों की तुलना में डिबग करने के लिए आसान है। एफएसएम के बारे में क्या अच्छा है नाम पर है ... आपके पास 15 राज्यों के साथ एक राज्य मशीन हो सकती है, ताकि आप सभी संक्रमणों को दिखाते हुए पेपर के टुकड़े पर एक आरेख तैयार कर सकें। आप सिस्टम के उपयोगी गुणों को समझने के लिए आरेख का उपयोग कर सकते हैं, जैसे कि यह किस स्ट्रिंग को स्वीकार करता है और यह कैसे त्रुटि राज्यों में आता है। अधिक जटिल प्रणालियों के साथ, आरेखण अक्सर मुश्किल या असंभव होता है।

यहां तक ​​कि लोग हैं, जो कहते हैं कि "gotos बुराई कर रहे हैं" लगता है कि वे राज्य मशीनों को लागू करने के सही तरीके से कर रहे हैं। (बेशक, कुछ लोग सोचते हैं कि गेटोस हमेशा बुराई है ... लेकिन आप सभी को खुश नहीं कर सकते हैं)।

5

आपको बता नहीं सकता कि वे क्या कहते हैं।

लेकिन ओओ और एफएसएम सॉर्टा विभिन्न समस्या डोमेन पर हमला करता है। ऐसे डोमेन में जहां ऑब्जेक्ट्स इंटरैक्ट कर रहे हैं - जो ऑब्जेक्ट-ओरिएंटेड दृष्टिकोण के लिए कॉल करता है। ऐसे डोमेन में जहां दुनिया एक राज्य या दूसरे में है - जो कि एफएसएम डिज़ाइन की मांग करती है।

वास्तविक, आप अमूर्त के विभिन्न स्तरों, जो बाहर केवल एक या दूसरे का उपयोग करने से क्लीनर आ जाएगा पर/साथ इन डिजाइनों मिश्रण कर सकते हैं।

6

परिष्कृत राज्य मशीन कुछ अंत प्राप्त करने के लिए एक उपकरण हैं। किसी भी उपकरण के रूप में, उनका भी दुरुपयोग किया जा सकता है।

वे उपकरण की सबसे दयालु नहीं हैं, लेकिन वे जिस काम पर अच्छे हैं, वे अन्य साधनों से हासिल करना असंभव है (और आमतौर पर किसी भी अन्य दृष्टिकोण को मशीन से हजारों गुना अधिक भयानक गड़बड़ माना जाता है)।

नौकरी ऐसी स्थितियों में परिचालन कर रही है जहां क्लासिक प्रतीक्षा राज्यों को मना किया गया है।

मुझे टचस्क्रीन पढ़नी है। स्थिति को पढ़ने के लिए, मुझे एसपीआई पर लगभग 15 कमांड का आदान-प्रदान करना होगा। मुझे एक सेकंड में 100 रीडआउट्स चाहिए। प्रत्येक आदेश के बाद मुझे लगभग 1 माइक्रोसॉन्ड का इंतजार करना होगा, संबंधित व्यस्त ध्वज जारी रखने से पहले गायब हो जाएगा। ऐसे कई अन्य ऑपरेशंस भी हैं जो एक ही इंटरफ़ेस पर उपलब्ध होना चाहिए, जैसे कि कंट्रास्ट सेट करना, मोड बदलना, बैकलाइट चालू करना या बंद करना, तापमान पढ़ना। अगर मैंने प्रत्येक प्रतीक्षा के लिए while(BUSY_BIT); प्रदर्शन किया, तो मैं क्षणों के मामले में सभी सीपीयू खाऊंगा। अगर मैंने sched_yield() या usleep(1) किया था, तो मैं कभी भी उन रीडआउट्स की संख्या प्राप्त नहीं करूंगा जो मैं चाहता हूं। एकमात्र तरीका एक सीमित राज्य मशीन है।

लेकिन परिमित राज्य मशीन को भी अच्छा बनाने के तरीके हैं। दृश्यों के पीछे मशीन को छुपाएं और डेवलपर्स को काम करने के लिए काम करें।

मेरा नौकरी अनुभव अब तक 2 अलग-अलग परिमित राज्य मशीनों के आधार पर 2 सिस्टमों का प्रभुत्व था।

  1. एक बड़ा वेब पोर्टल, जहां प्रत्येक चरण में आप डेटाबेस से कुछ डेटा पुनर्प्राप्त करते हैं, और उस पर आधारित अधिक प्रश्न तैयार करते हैं। अंतिम चरण में आप HTML उत्पन्न करने के लिए डेटा का उपयोग करते हैं। प्रत्येक कार्य - एक वेबपृष्ठ मॉड्यूल - इंजन से विरासत में प्राप्त एक PHP वर्ग के रूप में लागू किया गया था। राज्य कक्षा चर में संरक्षित किया गया था। प्रत्येक चरण एक अलग समारोह था। एक कदम के अंत में, संग्रहित प्रश्नों को अनुकूलित किया गया और इंजन को कैश के माध्यम से भेजा गया, और उत्तर मूल पर वापस प्रदान किए गए।
  2. कई उपप्रणाली वाले एक एम्बेडेड डिवाइस। कार्य पंप का उपयोग किया जाता है। प्रत्येक मॉड्यूल एक हैंडलर को पंजीकृत करता है जिसे मुख्य लूप से कई बार कहा जाता है। हैंडलर राज्यों के साथ स्थिर या वर्ग चर में राज्य को संरक्षित रख सकता है। यह सहकारी मल्टीटास्किंग अलग-अलग धागे में चलने की तुलना में बहुत छोटी मेमोरी पदचिह्न की अनुमति देता है, उन्हें मैन्युअल रूप से दो बार पंजीकृत करके मैन्युअल प्राथमिकता के लिए अनुमति देता है, और थ्रेड उच्च प्राथमिकता पर चलता है, शेष सिस्टम को ओवरहाइड करता है।
  3. सेमी-दुभाषिया। वह टचस्क्रीन। फंक्शन कॉल और उनके प्रतीक्षा राज्य पंजीकृत हैं, लेकिन प्रत्येक को केवल एक बार बुलाया जाता है, फिर प्रोग्राम कतार से हटा दिया जाता है। दुभाषिया को टास्कपंप का कार्य कहा जाता है, जो एक प्रतीक्षा स्थिति के रूप में चिह्नित फ़ंक्शन का सामना करते हुए सीमित संख्या में फ़ंक्शन निष्पादित करता है (या कहने वाले कार्यों की संख्या से अधिक)। फिर यह तब तक जारी रहता है जब तक प्रतीक्षा राज्य गायब न हो जाए। अन्य कार्य निष्पादित किए जाने वाले कार्यों के अनुक्रमों (कभी-कभी लंबे) के रूप में कार्यवाही करते हैं, फिर परिणाम के लिए प्रतीक्षा करें। इस तरह से मैं उन राज्यों की संख्या को सीमित कर सकता हूं जिन्हें मुझे लगभग 4 तक बनाने की आवश्यकता है जहां मुझे परिणामों की आवश्यकता है। यदि आदेश "भेजना, कभी भी परिणाम की जांच न करें" जैसे "सेट कंट्रास्ट" है, तो उन्हें अलग-अलग राज्यों की आवश्यकता नहीं है। तो वास्तविक राज्य "घटना के लिए प्रतीक्षा करें और अनुरोधित डेटा पंजीकृत करें", "माप के लिए प्रतीक्षा करें" और "परिणाम पढ़ें और उन्हें ठीक से असाइन करें"।

कोड दो बार सरल और तीन बार स्पष्ट होगा यदि संरचनात्मक रूप से या अनुक्रमिक रूप से लिखा गया हो। सिवाय इसके कि यह काम नहीं करेगा, या अबाध प्रदर्शन के साथ काम करेगा।

0

किसी भी कक्षा के व्यवहार का प्रतिनिधित्व करने के लिए राज्य मशीन का उपयोग किया जा सकता है। यदि आने वाली घटनाओं का आदेश क्लास व्यवहार (संयोजक वर्ग) से कोई फर्क नहीं पड़ता है, तो राज्य मॉडल का उपयोग कोई विशेष लाभ नहीं देता है।

हालांकि यदि कक्षा का व्यवहार आने वाली घटनाओं (क्रमिक कक्षा) के आदेश पर निर्भर करता है तो राज्य मशीन व्यवहार विश्लेषण और कार्यान्वयन के लिए सबसे अच्छी पसंद का प्रतिनिधित्व करती है।

यदि पठनीयता/रखरखाव आपकी चिंता है, तो ग्राफिकल प्रतिनिधित्व का उपयोग करें। विभिन्न इंजीनियरिंग डोमेन से संबंधित वर्गों के व्यवहार के उदाहरण ग्राफिकल और निष्पादन योग्य रूप में http://www.StateSoft.org -> स्टेट मशीन गैलरी में प्रस्तुत किए जाते हैं।

-Janusz

+0

मुझे विश्वास नहीं है कि यह सच है कि कक्षाओं में एक पूर्ण भाषा का पूर्ण उपयोग होता है। https://upload.wikimedia.org/wikipedia/commons/a/a2/Automata_theory.svg – Catskul

1

FSM के समझने के लिए और बनाए रखने अगर कोड सही तरीके से संरचित है करने के लिए आसान हो सकता है।

FSM

संबंधित मुद्दे