48

मैंने हाल ही में एक निश्चित मानक ऑब्जेक्ट उन्मुख मानसिकता से आने वाले ईवेंट-संचालित आर्किटेक्चर के साथ खेलना शुरू कर दिया है।लेखन सतत इवेंट-संचालित कोड

पहली बात मैंने देखी थी कि कार्यक्रमों के माध्यम से समझने और ट्रेस करने में कठिनाई कार्यक्रम के आकार के साथ तेजी से बढ़ती प्रतीत होती है। जबकि छोटे पालतू परियोजनाओं का पालन करना आसान है, ऐसा लगता है जैसे कोड तेजी से स्पेगेटी में बदल जाएगा।

मैं समझता हूं कि मैं इस विकास मानसिकता के लिए नया हूं और मेरी सभी ऑब्जेक्ट उन्मुख चिंताएं पूरी नहीं होती हैं। क्या रखरखाव योग्य, समझने योग्य घटना-संचालित कोड लिखने पर कोई संसाधन है? नोड.जेएस या ट्विस्ट या इवेंट मशीन का उपयोग करने वाले लोग इस बारे में क्या करते हैं?

उत्तर

4

के रूप में वह यह है कि क्या मैं अभी बहुत बड़ा वितरित अनुप्रयोगों के निर्माण के लिए उपयोग कर रहा हूँ मैं एक उदाहरण के रूप अजगर इस्तेमाल करेंगे देखो।

ट्विस्ट पायथन इनलाइनकॉलबैक या (थोड़ा उलझन) स्थगित जनरेटर शैलियों का उपयोग करके एक बहुत ही अनिवार्य शैली के लिए अनुमति देता है। ये विधियां आपको उन प्रक्रियाओं को लिखने की अनुमति देती हैं जो घटना संचालित कॉलबैक कोड का उपयोग करती हैं जो पढ़ने और समझने में बहुत आसान है। कार्यान्वयन आपके कार्य को आलसी अनुक्रम में बदल देता है जो स्थगित होने का अनुक्रम उत्पन्न करता है।

विशेष रूप से, आपको कॉलबैक फ़ंक्शंस/लैम्बडास/क्लोजर का गहरा घोंसला सेट सेट करने की आवश्यकता नहीं है, और इसके बजाय मनमाने ढंग से बिंदुओं पर ईवेंट लूप पर फ़ंक्शन का नियंत्रण प्राप्त कर सकता है। यदि आप चाहें तो आप मानसिक रूप से कोरआउट या सहकारी मल्टीटास्किंग के रूप में इसे फिर से लेबल कर सकते हैं। इससे काम हो जाता है। एक उदाहरण इस तरह (भद्दा deferredGenerator शैली का प्रयोग करके) होगा:

@defer.deferredGenerator 
def foo(arg): 
    bar = nonBlockingFunction(foo) 
    baz = waitForDeferred(aFunctionThatReturnsADeferredToo(bar)) 
    yield baz #Returns control to the event loop 
    output = baz.getResult() #This gets the output of aFunctionThat...Too above 
    yield output #This is how we return a result instead of using return 

@defer.deferredGenerator 
def aFunctionThatReturnsADeferredToo(put_bar_here): 
    """Stuff happens here....""" 
    ...etc... 

यहाँ एक और पोस्ट कि inlineCallbacks विधि है, जो क्लीनर है पता चलता है, लेकिन अजगर 2.5 या नए (नहीं अर्थ Centos के तहत/RHEL 5 की आवश्यकता है श्रृंखला, जो मैं अपने ऐप के लिए उदास हूँ)। यदि आप इसका उपयोग कर सकते हैं तो ऐसा करें।

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

डिबगिंग के लिए, आप अपने प्रारंभिक कोड में कहीं भी defer.setDebugging (True) कॉल का उपयोग करके ट्विस्ट रिएक्टर डीबगिंग चालू कर सकते हैं। यह मूल ट्रेसबैक संलग्न करेगा जो आपके कोड में एक अपवाद उठाता है, ताकि आप यह देख सकें कि वास्तव में त्रुटि कहां हुई है। उत्पादन शुरू करने से पहले बस सेटबैबिंग कथन को फिर से शुरू करना याद रखें, क्योंकि इसके परिणामस्वरूप अतिरिक्त आत्मनिरीक्षण की बड़ी मात्रा में परिणाम होता है (यदि आप पूरी तरह से भयभीत होना चाहते हैं तो इसे स्ट्रेस में देखें)।

1

जाहिर है पहले से ही सर्वोत्तम प्रथाओं और मॉडल है कि समय के साथ विकसित करने के लिए जारी रहेगा है।

हालांकि, यह भी संभावना है कि प्रोग्रामिंग प्रोग्रामिंग "छोटे पालतू परियोजनाओं" के लिए एक दूसरे के साथ बातचीत करने का अवसर प्रदान करती है। ऐसी दुनिया की कल्पना करें जहां हजारों वितरित व्यक्तिगत परियोजनाओं ने उपयोगकर्ता द्वारा परिभाषित कॉलबैक के माध्यम से वास्तविक समय में बातचीत की।

उपयोगकर्ता और डेवलपर मौजूदा एप्लिकेशन डिज़ाइन पर निर्भर होने के बजाय शीर्ष प्रोटोकॉल पर मौजूदा प्रोटोकॉल पर वेब और एप्लिकेशन को पुनः प्राप्त करने में सक्षम होंगे। आवेदन डिजाइनर तब एक-आकार-फिट-सभी समाधान प्रदान करने या हर संभावित आकस्मिकता के बारे में चिंता करने के बजाय व्यक्तिगत उपयोग मामलों पर ध्यान केंद्रित करने के लिए स्वतंत्र होंगे।

चेक बाहर Web Hooks और कैसे Twilio जैसी सेवाओं को पहले से ही काम कर रहे हैं

4

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

@defer.inlineCallbacks 
def foo(arg): 
    bar = nonBlockingFunction(foo) 
    output = yield FunctionThatReturnsADeferredToo(bar) 
    defer.returnValue(output) #This is how we return a result instead of using return 
6

Martyn Loughran wrote an excellent short article पूरी तरह कॉलबैक स्पेगेटी बचने के बारे में।

मुझे अपने लेख के बारे में वास्तव में क्या मज़ा आया है प्रक्रिया स्पेगेटी को कुछ अच्छे और साफ में सुधारने के लिए; यह पहली बार थोड़ा औपचारिक प्रतीत होता है, लेकिन जब आप अंतिम परिणाम देखते हैं तो मुझे लगता है कि आप सहमत होंगे कि वह वास्तविक कलाकृति को स्वच्छ, सुस्पष्ट, कोड में दिखाता है।

1

मेरी एकमात्र सलाह कार्यात्मक सोचती है।

+2

विस्तार करने के लिए देखभाल? – keyle