क्या "जब" कथन जैसी कोई बात है? [बन्द है]


12

क्या कोई भाषा या भाषा सुविधा है जो "कब" मामलों को संभाल सकती है? यही है, जब भी कुछ स्थिति किसी भी दायरे या संदर्भ में सही हो जाती है, तो अतिरिक्त कोड निष्पादित करने के लिए निर्दिष्ट किया जा सकता है?

ध्यान दें कि यह एक सरल से अलग है if, जो एक विशेष दायरे में होना चाहिए और स्पष्ट रूप से लिखा जाना चाहिए। यह तब होगा जब क्लॉज लगभग ऐसा ही होगा ifजो इसके बाद कार्यक्रम के निष्पादन में हर मामले पर लागू होता है।


1
Sql सर्वर select case table1.col1 when 1 then 'Y' else 'N' end as col1_yn from ...:। इसके अलावा: msdn.microsoft.com/en-us/library/dd233249.aspx मूल रूप से मैं Google कोड खोज का उपयोग करके "जब" खोज करूंगा।
नौकरी

5
@ जॉब: यह एक क्लॉज है, स्टेटमेंट नहीं।
बेन वोइगट

2
आप Verilog में पसंद है?
dan04

2
अधिक विवरण की आवश्यकता है ... बहुत व्यापक प्रश्न।
वर्नरसीडी

2
यहां मेटा पर सवाल पर चर्चा की जा रही है
एडम लेअर

जवाबों:


25

आपका प्रश्न स्पष्ट नहीं है, लेकिन ऑब्जर्वर पैटर्न वह चीज़ है जो आप देख रहे हैं। http://en.wikipedia.org/wiki/Observer_pattern


1
हां, मैंने जो पूछा, वह इसके लिए एक देशी कार्यान्वयन की तरह लगता है। मैं भी प्रतिक्रियाशील प्रोग्रामिंग पर एक दिलचस्प पेपर की ओर इशारा करना चाहता हूं, जो "पोस्ट पर्यवेक्षक पैटर्न को दर्शाती है" (कोई लिंक, CTRL + F यह नहीं है)। जब कोई कथन, सिद्धांत रूप में, कोड के एक ब्लॉक को चलाएगा, तो कार्यक्रम के निष्पादन के दौरान, एक शर्त पूरी की जाती है - इस बात पर ध्यान दिए बिना कि इसे कैसे लागू किया जाता है - और इससे कम से कम मेरे काम में आसानी होगी, जिसके बजाय इसे लागू करना होगा अपने आप से पर्यवेक्षक पैटर्न।
विंडसकर

15

सिंटेक्स वार, काफी भाषाओं में एक whenकीवर्ड होता है, लेकिन मैं किसी भी भाषा से अनजान हूं जो इसका वर्णन करने के तरीके का उपयोग करता है।

'जब एक्स होता है, तो वाई' पैटर्न पहलू-उन्मुख प्रोग्रामिंग के मूल की तरह होता है: एक रैखिक प्रवाह को परिभाषित करने के बजाय, आप कुछ परिस्थितियों में हैंड हैंडलर्स (उर्फ 'एक' घटना 'की सदस्यता लेते हैं)। इस तरह की प्रोग्रामिंग जीयूआई अनुप्रयोगों में लोकप्रिय है, जहां कार्यक्रम की मुख्य दिनचर्या एक घटना प्रेषण है।

कुछ भाषाओं में भाषा के निर्माण के माध्यम से ऐसे तंत्र प्रदान करने के लिए व्यापक वाक्यविन्यास विशेषताएं हैं; एक उदाहरण अपने प्रतिनिधियों और घटनाओं के साथ C # होगा:

// 'when btnOK is clicked, run HandleOKClick'
btnOK.Clicked += this.HandleOKClick;

अन्य भाषाएँ OOP कंस्ट्रक्शन (ऑब्जर्वर पैटर्न, ईवेंट श्रोताओं, आदि का उपयोग करती हैं।) जावा में एक उदाहरण है (मेरा जावा थोड़ा कठोर है, इसलिए इसे संपादित करने के लिए स्वतंत्र महसूस करें):

Foobar f = this;
btnOK.registerClickHandler(
    new ClickHandler {
        public void handleClick(Event e) {
            f.handleOKClick(e);
        }
    });

फिर भी एक और दृष्टिकोण सादे पुराने कॉलबैक का उपयोग कर रहा है। जावास्क्रिप्ट में उदाहरण:

var btnOK = $('btnOK');
btnOK.click(handleOKClick);

15

अब तक किसी ने उल्लेख किया है INTERCAL के COMEFROM :

COMEFROM को शुरू में मजाक विधानसभा भाषा निर्देशों ('CMFRM') की सूचियों में देखा गया था। यह 1973 में आर। लॉरेंस क्लार्क द्वारा एक डाटामेशन लेख में विस्तृत किया गया था, जो एग्जर्स डीजकस्ट्रा के पत्र गो टू स्टेटमेंट को ध्यान में रखते हुए हानिकारक के जवाब में लिखा गया था। COMEFROM अंततः गूढ़ प्रोग्रामिंग भाषा INTERCAL के C-INTERCAL संस्करण में लागू किया गया था और साथ ही और भी अस्पष्ट 'कम्प्यूटेड COMEFROM' के साथ। 'असाइन किए गए COM FROM' और 'DONT' कीवर्ड (मौजूदा 'DO' लूप के पूरक के लिए) के लिए फोरट्रान प्रस्ताव भी थे।

1 अप्रैल 2004 को, रिची हिंदुले ने पायथन प्रोग्रामिंग भाषा के लिए GOTO और COMEFROM दोनों का कार्यान्वयन प्रकाशित किया। अप्रैल फूल्स डे पर रिलीज़ होने और गंभीर उपयोग के लिए इरादा नहीं होने के बावजूद, वाक्यविन्यास वैध है और कार्यान्वयन पूरी तरह से काम करता है।


7
... और आपको इसे खराब करना था! :-)
स्टीफन सी


2
@BenVoigt: पोस्टिंग के समय आपके उत्तर में "इंटरकाल" या "COMEFROM" शामिल नहीं था।
डेडएमजी

2
@DeadMG: मेरे जवाब में पहले संस्करण से " en.wikipedia.org/wiki/COMEFROM " निहित था।
बेन वोइग्ट

2
@BenVoigt: यह गिनती नहीं है।
डेडएमजी

6

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

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


एक उदाहरण (ऊपर लिंक किए गए मैनुअल पेज से कोड के आधार पर) दिखाता है।

set foo 1
set bar 2
proc doMult args {
    global foo bar foobar
    set foobar [expr {$foo * $bar}]
}
trace add variable foo write doMult
trace add variable bar write doMult
doMult

उस समय के बाद, किसी भी समय है कि या तो से $fooया $barएक नया पूर्णांक हो जाता है, $foobarदो की उत्पाद हो जाता है। खुद ब खुद।


Tcl भी कोड को अन्य प्रकार के ट्रिगर्स पर चलाने की अनुमति देता है, जैसे कि कमांड्स का निष्पादन, कमांड्स को हटाना, टाइमर, सॉकेट्स पर उपलब्ध डेटा आदि। Tk लाइब्रेरी जोड़े जाने के साथ, यह एक पूरे बड़े सेट को शामिल करने के लिए विस्तारित होता है। जीयूआई की घटनाओं के रूप में अच्छी तरह से। यह कहना सही है कि Tcl वास्तव में एक बहुत मजबूत घटना-उन्मुख भाषा है (भले ही आप आसानी से कोड लिख सकते हैं जो कभी भी उन विशेषताओं का उपयोग नहीं करता है)।


4

इवेंट हैंडलिंग जैसा कुछ?

फंक () के बजाय घटना को संभालता है

आप कहते हैं कि जब इवेंट फंक होता है

या, शायद एक विशेष संस्करण पर एक कॉलबैक?


निश्चित रूप से एक घटना की तरह लगता है।
टन प्लाम्प

4

हाँ, एक बयान संशोधक के रूप में पर्ल में एक ऐसा कीवर्ड है:

say 'Well done!'        when 'A';

यह स्विच स्टेटमेंट का भी हिस्सा है:

given ($foo) {
    when (/^abc/) { $abc = 1; }
    when (/^def/) { $def = 1; }
    when (/^xyz/) { $xyz = 1; }
    default { $nothing = 1; }
}

5
मैं पर्ल को नहीं जानता, लेकिन यह 'जब' मेरे लिए 'अगर' की तरह अधिक दिखता है ... मुझे लगता है कि सवाल का अर्थ 'जब <घटना> <कार्रवाई>' का प्रकार 'जब' होता है।
ShdNx

1
switchमेरे लिए एक बयान की तरह खुशबू आ रही है। (पीतल उस पर knobs, लेकिन फिर साथ यह है पर्ल ...)
डोनल अध्येताओं

दरअसल, यह caseएक switchबयान में है। ठीक वैसे ही जैसे आदा में।
मौविसील

4

क्या यह ( COMEFROMविकिपीडिया पर वर्णित कथन) की गणना है?

सारांश:

COMEFROM लगभग GOTO के विपरीत है कि यह कोड में किसी भी मनमाने ढंग से COMEF कथन के लिए निष्पादन स्थिति ले सकता है। कोड में वह बिंदु जहां राज्य स्थानांतरण होता है, आमतौर पर COMEFROM के पैरामीटर के रूप में दिया जाता है। क्या निर्दिष्ट हस्तांतरण बिंदु पर निर्देश से पहले या बाद में स्थानांतरण होता है या नहीं, यह प्रयुक्त भाषा पर निर्भर करता है। उपयोग की गई भाषा के आधार पर, एक ही प्रस्थान बिंदु को संदर्भित करने वाले कई COMEFROM गैर-निर्धारक हो सकते हैं, किसी प्रकार की परिभाषित प्राथमिकता में निष्पादित किए जा सकते हैं, या थ्रेडेड इंटरकॉल में देखे गए समानांतर या अन्यथा समवर्ती को प्रेरित करते हैं।


6
मैं देखता हूं कि आप कहां से आ रहे हैं।
पबि

6
कोई सारांश के साथ एक लिंक के लिए -1; लिंकरोट हो सकता है।
ह्यूगो

5
@ बनिए - भले ही आपका उत्तर 3 शब्दों से थोड़ा अधिक लिखने की जहमत उठाने से बेहतर होगा।
ब्लैकजैक

3
@BenVoigt: उस स्थिति में आप इसे "इस" के पीछे छिपाने के बजाय पूरी लिंक को चिपका सकते हैं।
मार्जन वेनमा

1
@BenVoigt: मेरा कहना यह था कि आपने "इस" के पीछे छुपाने के बजाय पूरे लिंक को चिपकाया था, खोज करने के लिए शब्द आपके उत्तर के पाठ में तुरंत दिखाई देंगे, बजाय इसके कि आप लिंक पर मँडराएँ ... इसके अलावा मैं ब्लैकजैक और ह्यूगो से सहमत हूं कि एक उत्तर जो मुख्य रूप से एक लिंक है, उसे कम से कम एक संक्षिप्त सारांश देना चाहिए जो वहां पाया जा सकता है। यह सुनिश्चित करने में मदद करता है कि StackExchange अपने दो पैरों पर खड़ा हो सकता है, भले ही लिंक सड़ता हो।
मार्जन वेनमा

3

क्या आप स्टेटमेंट के समय एक सिंक्रोनस या एसिंक्रोनस वाली भाषा की तलाश कर रहे हैं?

मेरे लिए एक घटना (/ सदस्यता / कॉलबैक) पैटर्न की तरह लगता है।

उदाहरण के लिए

conditionOwner.Condition += listener.WhenCondition

जब भी हालत के मालिक को यह सूचित किया जाता है कि स्थिति हो गई है, तो श्रोता कब करेगा ()।

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

भाषाओं के अनुसार, .NET उदाहरण के लिए (यानी C #) ने सिंक्रोनस सब्सक्रिप्शन (ईवेंट्स) में बनाया है और इसके रिएक्टिव एक्सटेंशन्स (RX) एसिंक्रोनस सब्सक्रिप्शन को जोड़ते हैं।


3

विवरण ध्वनि एक डेटाबेस ट्रिगर की तरह है जो एक निश्चित परिदृश्य की प्रतीक्षा करने और फिर निष्पादित करने के लिए डिज़ाइन किया गया है।

विकिपीडिया से:

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

http://en.wikipedia.org/wiki/Database_trigger


3

आप जिस बारे में बात कर रहे हैं वह संरचना की तुलना में कम वाक्य रचना है । आपके पास वास्तव में केवल एक कथन हो सकता है जैसे कि एक प्रणाली जो तर्क की एक सीमित मात्रा को निष्पादित करती है, फिर कथनों को निष्पादित करती है, फिर एक अनंत लूप में जारी रहती है और फिर से तर्क को निष्पादित करती है।whenwhen

उदाहरण के लिए विंडोज प्रोग्रामिंग आम तौर पर "ईवेंट आधारित" है। एक बटन की Clickघटना के लिए सब्सक्राइब करना अनिवार्य रूप से "क्लिक किए जाने पर ऐसा करना" है। हालांकि, हुड के नीचे क्या हो रहा है एक संदेश प्रसंस्करण लूप है। उपयोगकर्ता द्वारा बटन क्लिक करने पर विंडोज एप्लिकेशन को संदेश भेजता है, और अनुप्रयोग में संदेश प्रसंस्करण लूप उपयुक्त ईवेंट हैंडलर चलाता है।

यदि आप उदाहरण के लिए, C # में घटनाओं का उपयोग करते हैं, तो आप इसे संदेश लूप के बिना भी कर सकते हैं, लेकिन सीमा यह है कि आपको समय से पहले घटना की घोषणा करनी होगी, इसलिए आप whenकिसी भी तरह के घड़ियों के लिए आर्टवर्क स्टेटमेंट नहीं लिख सकते हैं राज्य। आपको किसी विशिष्ट घटना की प्रतीक्षा करनी होगी।

वॉन न्यूमैन आर्किटेक्चर में इस व्यवहार को प्राप्त करने के लिए आपको किसी प्रकार के अनंत लूप को चलाना होगा जो हर बार लूप के माध्यम से सभी परिस्थितियों की जांच करता है कि क्या उपयुक्त कोड चल रहा है। आंतरिक रूप से आपको बस if/ thenया switchबयानों की एक बड़ी सूची मिलती है । अधिकांश डेस्कटॉप एप्लिकेशन और वेब प्रोग्रामर उल्टी कर देंगे अगर उन्होंने ऐसा निर्माण देखा है तो यह वास्तव में केवल तालमेल है यदि आप इसे विंडोज इवेंट मॉडल (भले ही यह हुड के नीचे चल रहा हो) की तरह किसी प्रकार के सिंथेटिक चीनी में लपेटते हैं।

दूसरी ओर, यदि आप एम्बेडेड फर्मवेयर विकास, वास्तविक समय के अधिकारियों, या औद्योगिक नियंत्रकों के क्षेत्र को देखते हैं, तो प्रोग्रामिंग का यह मॉडल बहुत आम है। उदाहरण के लिए, यदि आपके पास एक वास्तविक समय कार्यक्रम है, तो आप व्यक्त करना चाहते हैं:

outputA = input1 && input2

कोड समझने के लिए सीधा है (क्योंकि यह घोषणात्मक है)। हालांकि, इसे काम करने के लिए आपको इसे एक तंग लूप में निष्पादित करना होगा। आप outputAलूप के माध्यम से हर बार पुनर्मूल्यांकन करते हैं। बहुत सारे डेस्कटॉप या वेब प्रोग्रामर इसे पसंद नहीं करेंगे क्योंकि यह अक्षम है। उनके लिए, आपके द्वारा पुनर्मूल्यांकन करने का एकमात्र समय outputAतब होता है जब input1या input2बदल जाता है। वे कुछ और देखना चाहेंगे जैसे आप वर्णन कर रहे हैं:

when input1 changes
    evaluateOutputA()

when input2 changes
    evaluateOutputA()

evaluateOutputA()
    outputA = input1 && input2

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

दूसरी ओर, यदि input1परिवर्तन के महत्वपूर्ण होने पर आपको जो काम करना है, तो आपके whenखंड का अर्थ हो सकता है। पीएलसी में इस प्रकार के निर्देश को "बढ़ती बढ़त का पता लगाने" कहा जाता है। यह input1लूप के माध्यम से अंतिम समय पर स्थिति को बचाता है , इस समय के मूल्य से तुलना करता है, और तर्क को निष्पादित करता है यदि अंतिम स्थिति झूठी थी और यह राज्य सत्य है।

यदि आपके पास वॉन न्यूमैन आर्किटेक्चर नहीं है, तो खेल बदल जाता है। उदाहरण के लिए यदि आप VHDL में FPGA की प्रोग्रामिंग कर रहे हैं , तो जब आप लिखते हैं:

outputA = input1 && input2

(... या जो भी उपयुक्त VHDL सिंटेक्स होगा) तो FPGA वास्तव में ऐसे ही तार-तार हो जाता है input1और input2उन्हें AND गेट के इनपुट से तार दिया जाता है , और AND गेट के आउटपुट को वायर्ड कर दिया जाता है outputA। इसलिए, न केवल कोड को समझना आसान है, इसे अन्य सभी तर्क के साथ समानांतर में भी निष्पादित किया जाता है, और यह कुशल है।

जब आप एक पीएलसी या पीएसी जैसे औद्योगिक नियंत्रक के बारे में बात कर रहे हैं, तो पांच IEC-61131-3 भाषाओं में से एक में प्रोग्राम किया गया है, विशिष्ट मामला इस तरह की व्यवस्था है:

  1. मेमोरी में इनपुट और स्टोर पढ़ें
  2. मुख्य कार्यक्रम निष्पादित करें
  3. मेमोरी से वास्तविक आउटपुट तक आउटपुट लिखें
  4. चरण 1 पर जाएं

यह सिस्टम की वास्तुकला में बनाया गया है, इसलिए यह उम्मीद है कि आप बस लिखेंगे:

outputA = input1 && input2

... और इसे एक सतत लूप में निष्पादित किया जाएगा।

इन मशीनों में इंटरप्ट रूटीन भी हैं। ये उस whenऑपरेटर के लिए हार्डवेयर स्तर के समर्थन की तरह हैं, जिसके बारे में आप बात कर रहे हैं। हार्डवेयर बाधा एक बाहरी घटना के बारे में कुछ कोड को क्रियान्वित करने का एक साधन है। उदाहरण के लिए, जब कोई नेटवर्क कार्ड कहता है कि उसके पास डेटा प्रतीक्षा है, तो प्रोसेसर को सामान्य रूप से उस डेटा को तुरंत पढ़ना होगा या आप बफर स्थान से बाहर चले जाएंगे। हालाँकि, जितनी बार आपको एक वास्तविक हार्डवेयर व्यवधान को हुक करने की आवश्यकता होती है, मुझे संदेह है कि इसके लिए एक भाषा कीवर्ड भी शामिल है। आप CPU इनपुट पिन तक सीमित रहेंगे, और ऐसा लगता है कि आप आंतरिक प्रोग्राम स्थिति का परीक्षण करना चाहते हैं।

तो, एक पारंपरिक भाषा में (एक तंग लूप के बिना जो असीम रूप से चलती है) आपको सवाल पूछना होगा, "मूल्यांकन कोड कब चलता है"?

यदि आप लिखते हैं:

when A do
    launchNukes()

... और मान Aलेना एक मनमाना बूलियन अभिव्यक्ति है, आप कैसे जानते हैं कि उस अभिव्यक्ति का पुनर्मूल्यांकन कब करना है? एक अनुभवहीन कार्यान्वयन का मतलब होगा कि आपको हर एक मेमोरी लिखने के बाद इसका पुनर्मूल्यांकन करना होगा। आप सोच सकते हैं कि आप इसे कम कर सकते हैं, लेकिन इस पर विचार करें:

when systemTime > actionTime do
    launchNukes()

सूचना जो systemTimeहमेशा बदलती रहती है (हर बार जब आप इसे पढ़ते हैं, तो आपको एक अलग संख्या मिलेगी)। इसका अर्थ है कि आपके सभी whenखंडों के सशर्त भाग का लगातार मूल्यांकन किया जाना है। यह लगभग असंभव है (और बस एक सेकंड के लिए विचार करें कि क्या होता है यदि आपकी सशर्त अभिव्यक्ति के दुष्प्रभाव होते हैं!)

निष्कर्ष

आपके whenपास एक अनंत लूप के आसपास की वास्तुकला में एक बयान (जैसे कि आप वर्णन कर रहे हैं) हो सकता है जो मुख्य कार्यक्रम को चलाता है, फिर उन whenबयानों को निष्पादित करता है यदि इस लूप पर स्थितियां झूठी से सच तक चली गईं। हालांकि यह वास्तुकला एम्बेडेड और औद्योगिक उपकरणों में आम है, यह सामान्य प्रयोजन प्रोग्रामिंग भाषाओं में आम नहीं है।


3

AspectJ भाषा एक में शामिल हों-प्वाइंट मॉडल है, जो स्थिति के बिल्कुल इस तरह से निपटने के लिए एक समाधान है।

AspectJ में एक जॉइन-पॉइंट एक जावा प्रोग्राम में एक गतिशील घटना है जो प्रोग्राम को निष्पादित करते समय होती है। उदाहरण में शामिल होने के बिंदु हैं: (1) एक विधि कहा जाता है; (२) एक विधि निष्पादित की जाती है; (३) एक निर्माणकर्ता को कहा जाता है; (4) एक कंस्ट्रक्टर को निष्पादित किया जाता है; (५) एक क्षेत्र निर्धारित है; या (6) एक फ़ील्ड एक्सेस किया जाता है।

फिर आप इन सम्मिलित बिंदुओं के सेट बना सकते हैं, जिन्हें पॉइंटकट कहा जाता है। पॉइंटकट्स को सामान्य सेट सिद्धांत तरीके से जोड़ा जा सकता है, पूरक किया जा सकता है, और फिर से जोड़ा जा सकता है। अन्य बिंदु कटौती को वैरिएबल के मानों / प्रकारों पर वर्गीकृत किया जा सकता है (उदाहरण के लिए, "केवल जब x धनात्मक होता है", "केवल तब जब मान सेट किया जा रहा हो, इस प्रकार का एक उपवर्ग") और कार्यक्रम की स्थिति पर आधारित है ("जब इस विधि को कहा जाता है, लेकिन केवल जब यह अन्य विधि इस थ्रेड के ढेर पर होती है [मतलब है कि उस विधि को अप्रत्यक्ष रूप से इसे कहा जाता है] ")।

जब आपके पास इन सभी बिंदुओं का कार्यक्रम में घटनाओं का वर्णन हो जाता है, तो आप इन घटनाओं की सलाह देने के लिए एस्पेक्टज का उपयोग कर सकते हैं। आप beforeइस घटना के होने ( afterसलाह), या घटना के होने ( aroundसलाह) के बजाय, घटना ( सलाह) से पहले कुछ करने का विकल्प चुन सकते हैं ।

Aroundसलाह आपके कार्यक्रमों में कैशिंग जोड़ने के लिए विशेष रूप से सहायक है: जब किसी विधि को निष्पादित किया जाता है, तो यह देखने के लिए तालिका में देखें कि क्या पहले से ही गणना की गई है और यदि हां, तो कैश्ड संस्करण का उपयोग करें। AspectJ के साथ, यह इतना हल्का और अभिव्यंजक है कि आप अपने कोड में सैकड़ों अलग-अलग बिंदुओं पर ऐसे कैशिंग प्रयोगों को कर सकते हैं ताकि यह पता लगाया जा सके कि क्या और कहाँ कैशिंग मूल्यों को जोड़ता है।

पहलू उन्मुख प्रोग्रामिंग के बाहर कई लोगों का मानना ​​है कि एओपी ज्यादातर "लॉगिंग" के बारे में है। आप लॉगिंग को संभालने के लिए AspectJ का उपयोग कर सकते हैं, और यह काफी अच्छी तरह से करता है ("इस लॉग फ़ाइल में रिकॉर्ड जब इस पैकेज में सभी सार्वजनिक तरीकों को बुलाया जाता है, और उनके परिणाम / त्रुटि परिणाम क्या थे")। लेकिन AspectJ के लिए बहुत कुछ है, जिसमें डायनामिक स्कोप को अनुकरण करने के लिए एक चालाक चाल भी शामिल है जिसे वर्म होल पैटर्न कहा जाता है [स्लाइड 23 और बाद में देखें]।

AOP के बाहर, आप ईवेंट-आधारित प्रोग्रामिंग के बारे में भी बात कर रहे हैं, जिसमें शामिल है [जैसा कि अन्य ने नोट किया है] ऑब्जर्वर पैटर्न। समाधान के बीच का अंतर है: (1) कैसे स्थिति का पता लगाया जाता है; (२) जहाँ दशा व्यक्त की जाती है; और (3) कैसे-कोड-टू-एक्ज़ीक्यूट घटना के लिए बाध्य है।


2

नोटिफ़ / वेट का उपयोग कैसे करें यह इसके करीब प्रतीत होगा:

हमने उल्लेख किया है कि जावा प्रतीक्षा / सूचना तंत्र अनिवार्य रूप से थ्रेड्स के बीच संवाद करने का एक तरीका है। संक्षेप में, विचार इस प्रकार है:

  • एक या एक से अधिक धागे एक संकेत के लिए इंतजार कर रहे हैं;
  • एक और धागा साथ आता है और वेटिंग थ्रेड्स को सूचित करता है (यानी सिग्नल के साथ "इसे बनाता है / उन्हें")।

संदर्भ के आधार पर कुछ संरचनाएं हैं जो इसके करीब हो सकती हैं लेकिन आपको वास्तव में अपने प्रश्न को स्पष्ट करना होगा।

XSLT में "जब" कथन भी है :

तत्व का उपयोग परीक्षणों की एक श्रृंखला के आधार पर कार्रवाई के एक पाठ्यक्रम को निर्धारित करने के लिए किया जाता है। प्रत्येक परीक्षण एक तत्व के अंदर किया जाता है। यदि एक परीक्षण सफल होता है, तो तत्व के शरीर को निष्पादित किया जाता है। यदि कोई परीक्षण विफल नहीं होता है, तो डिफ़ॉल्ट कार्रवाई को निर्दिष्ट करने के लिए एक तत्व का उपयोग किया जा सकता है:


XSLT "जब" एक सशर्त बयान है, अगर एक से अधिक स्विच की तरह । हालाँकि, प्रारंभिक प्रश्न में एक "जब" के अर्थ का संदर्भ वास्तव में अच्छी तरह से स्पष्ट नहीं किया गया था।

मैं Sitecore CMS में अक्सर XSLTs का उपयोग करता हूं जहां मैं सामग्री प्रस्तुत करने के लिए काम करता हूं ताकि इसे कुछ मामलों में GUI वातावरण में उपयोग किया जा सके।


XSLT जब ए की तरह लगता है if, भले ही यह प्रक्रियात्मक प्रकार नहीं है जो ifआपको प्रोग्रामिंग भाषाओं में मिलेगा। (मैं एक सामान्य प्रोग्रामिंग भाषा की तुलना में XSLT को एक विशिष्ट डेटा प्रोसेसिंग भाषा के रूप में अधिक देखता हूं - मैं आपको XSLT का उपयोग करते हुए एक डेस्कटॉप GUI का निर्माण नहीं करता हूं)
Marjan Venema

2

आप जो पूछ रहे हैं उसे रिएक्टिव प्रोग्रामिंग कहा जाता है ।

यह प्रोग्रामिंग का एक प्रतिमान है जहां चर को उनके द्वारा असाइन किए गए अभिव्यक्ति के बारे में पता होता है और जब भी अभिव्यक्ति का एक घटक बदलता है, तो चर अभिव्यक्ति का पुनर्मूल्यांकन करके प्रतिक्रिया करता है, संभवतः अन्य समान पुनर्मूल्यांकन को निर्भरता की श्रृंखला को ट्रिगर करता है। ।

आमतौर पर यह प्रतिक्रियाशील व्यवहार पर्यवेक्षक पैटर्न के चतुर उपयोग के माध्यम से प्राप्त किया जाता है, जहां एक प्रतिक्रियाशील मूल्य स्वयं को श्रोता के रूप में उन घटनाओं के एक सेट में पंजीकृत करता है जो मूल्य के पुनर्मूल्यांकन को ट्रिगर करते हैं।

मेरे ज्ञान का सबसे अच्छा करने के लिए, एक प्रोग्रामिंग भाषा मौजूद नहीं है जो पूरी तरह से इसके मूल में प्रतिक्रियाशील प्रोग्रामिंग को गले लगाएगा, लेकिन कई भाषाओं में बहुत सारे पुस्तकालय हैं जो एक तरह से या किसी अन्य में प्रतिक्रियाशील प्रोग्रामिंग का लाभ प्रदान करते हैं।

अधिकांश डेटा बाइंडिंग फ्रेमवर्क को प्रतिक्रियाशील प्रोग्रामिंग के कार्यान्वयन माना जा सकता है

" ऑब्जर्वर पैटर्न का निक्षेपण " नामक एक अच्छा पेपर है , जो संभवतः पहले से कहीं ज्यादा बेहतर तरीके से समझाएगा, जो कि प्रतिक्रियाशील प्रोग्रामिंग के बारे में सब कुछ है और जो पहले से मौजूद तकनीकों के ऊपर और ऊपर इसे लागू करता है।


मेरे सवाल का सबसे अच्छा जवाब में से एक। बढ़िया कागज।
विंड्सकर

1
इसे "स्वीकृत" (विंक, विंक, नोड, नोड) के रूप में चिह्नित करने के लिए स्वतंत्र महसूस करें
रोलाण्ड टीपीपी

मैं इसे पोस्ट करने वाला था, लेकिन खुशी से आपने मुझे इसके लिए हरा दिया और इससे भी बेहतर जवाब लिखा। रिएक्टिव प्रोग्रामिंग कमाल है (और कार्यात्मक भाषाओं में यूआई बनाने का एक शानदार तरीका), लेकिन थोड़ा गूढ़।
तिखन जेल्विस

1
@ रोलैंडटेप बेशर्म आत्म-प्रचार, एह? मैं आपके बारे में प्रशंसा करता हूं। +1
नील

0

लिस्प (और इसके कई डायलेट्स, जिसमें स्कीम भी शामिल है) के पास यह है:

(when (> 2 1) 'do-something)

इसका मूल्यांकन करता है do-something:

(when nil 'other-thing)

nilया इसके समकक्ष मूल्यांकन करता है ।


2
लिस्प का whenअधिक पसंद है अगर, ओपी द्वारा अनजाने में वर्णित पर्यवेक्षक पैटर्न नहीं है।
ओसोडो

0

मैं इस तरह के बयान को केवल त्रुटि से निपटने के लिए जानता हूं। उदाहरण के लिए, BASIC ON ERROR ...या SQL * PLUS काWHENEVER SQLERROR ...

मध्यस्थता की स्थिति के लिए, स्थिति के सही होने पर सटीक क्षण को पकड़ने के लिए या तो एक बहुत ही चतुर कंपाइलर या एक महंगी महंगी ब्रूट फोर्स (हर बयान के बाद जांच) की आवश्यकता होगी।


0

यह डेटाफ़्लो भाषाओं की एक विशेषता है जैसे कि हार्डवेयर विवरण भाषाएँ (वेरिलॉग और वीएचडीएल)।

इसके अलावा, मैं एडीए और इसके अपवाद हैंडलिंग तंत्र के बारे में सोच सकता हूं: एक अपवाद हैंडलर को ट्रिगर किया जाता है whenकुछ अपवाद उठाया जाता है।


0

ऐसा लगता है कि आप स्थिति चर की तलाश कर रहे हैं , चीजें जो थ्रेड को सोने की अनुमति देती हैं जब तक कि कुछ विधेय सच नहीं हो जाते।

बूस्ट सी के लिए लागू उन्हें ++, अपाचे पोर्टेबल रनटाइम सी में कॉमन लिस्प के लिए लागू उन्हें आप उपयोग करेंगे bordeaux-threadकी make-condition-variable


क्या आप इसे लागू करने के लिए जिम्मेदार लाइब्रेरी के भाग का नाम बता सकते हैं?
विंडसकर

0

यदि आप ड्रोल को एक भाषा मानते हैं, तो हाँ।

एक उदाहरण:

rule "Rule 08 - Debit"
when
    AccountingPeriod( $start : start, $end : end )
    $cashflow : AllocatedCashflow( $account : account, $date : date <= $end, $amount : amount, type==TypedCashflow.DEBIT )
    not AccountingPeriod( start < $start)
then 
    $account.setBalance($account.getBalance()-$amount);
    retract($cashflow);
end

0

पर्ल 6 का उपयोग करते हुए सीधे फैशन में संकेतों को संभाल सकते हैं tap:

signal(SIGINT).tap: {
    note "Took { now - INIT now } seconds.";
    exit;
}

for 0, 1, *+* ... * {
    sleep 0.5;
    .say;
}

जबकि Powershell एक कोशिश / अंत में ब्लॉक के साथ एक रन लूप का उपयोग करके इसे संभाल सकता है:

$Start_Time = (Get-date).second
Write-Host "Type CTRL-C to Terminate..."
$n = 1
Try
{
    While($true)
    {
        Write-Host $n
        $n ++
        Start-Sleep -m 500
    }
}
Finally
{
    $End_Time = (Get-date).second
    $Time_Diff = $End_Time - $Start_Time
    Write-Host "Total time in seconds"$Time_Diff
}

के रूप में उपयोग करने की उम्मीद कर सकते हैं trap:

package require Expect

proc sigint_handler {} {
    puts "elapsed time: [expr {[clock seconds] - $::start_time}] seconds"
    set ::looping false
}

trap sigint_handler SIGINT

set start_time [clock seconds]
set n 0
set looping true
while {$looping} {
    puts [incr n]
    after 500
}

संदर्भ


0

यह एक लंबा समय रहा है क्योंकि मैंने इन पर ध्यान दिया है, इसलिए मुझे अच्छी तरह से गलत किया जा सकता है।

जैसा कि मुझे याद है, PL / I और BASIC दोनों के "ON" कथन थे। PL / I में, अवधारणा "ON DO" थी। BASIC में, यह "ON" था, जहाँ आमतौर पर GOSUB का विवरण दिया जाता था। दोनों भाषाओं में, जब भी निर्दिष्ट स्थिति सत्य हो जाती है, तो संबंधित कथनों को निष्पादित किया जाता है।

आप आज ऐसा नहीं करना चाहेंगे। संकलक को मूल रूप से काम का एक गुच्छा करना पड़ता है, ताकि यह पता चल सके कि कहाँ / कब स्थिति सही हो सकती है, इसलिए यह उस बिंदु पर एक परीक्षण उत्पन्न कर सकता है। एक बार जब आप संबद्ध हैंडलर में होते हैं, तो आप वास्तव में नहीं जानते हैं कि आप कहां से आए हैं, इसलिए आपको यह पता लगाना होगा कि वहां आपको क्या हुआ है, और आप शायद वहां वापस नहीं जाना चाहते हैं जहां से आप आए थे।


0

आपको ओपीएस 5 भाषा पर एक नज़र हो सकती है । इसके कार्यक्रमों को शर्तों के एक सेट के रूप में लिखा जाता है। जब किसी शर्त को पूरा किया जाता है, तो संबंधित कार्रवाई की जाती है। क्रियाएं राज्य को संशोधित कर सकती हैं, जिससे अन्य शर्तों को पूरा किया जा सकता है। हालांकि यह whenकीवर्ड का उपयोग नहीं करता है , यह आवश्यक रूप से "जब एक शर्त पूरी करता है" क्रिया करके काम करता है। से यहाँ :

OPS5 प्रोग्राम में एक डिक्लेरेशन सेक्शन होता है, जहाँ बेसिक डेटा कंस्ट्रक्शन को एक प्रोडक्शन सेक्शन के बाद परिभाषित किया जाता है जहाँ डेटा के हेरफेर के लिए नियम होते हैं।

OPS5 प्रोग्राम प्रोडक्शन मेमोरी और फायरिंग (निष्पादित) में नियमों के साथ काम करने वाले मेमोरी एलिमेंट्स का मिलान करके निष्पादित करते हैं जो सबसे प्रमुख नियम है जो मेल खाता है। मैच-चयन-निष्पादित चक्र तब तक जारी रहता है जब तक कि कार्यक्रम स्पष्ट रूप से बंद नहीं हो जाता है या जब तक कि कोई नियम कार्यशील मेमोरी से मेल नहीं खा सकता है।

मुझे इस भाषा में एक सरल पाठ साहसिक लिखना था जब मैं 90 के दशक की शुरुआत में विश्वविद्यालय में था। यह दिलचस्प था, लेकिन मुझे यकीन नहीं है कि यह अधिकांश डेस्कटॉप या मोबाइल कार्यों के लिए कितना उपयोगी होगा। यह एक बैकेंड वातावरण में समझ में आ सकता है, यद्यपि।



-1

अधिकांश ओओपी भाषाओं में यह एक अतिरिक्त धागा स्पॉन करना संभव होगा, इस संदर्भ में है:

    while (!value)
{
}

//Execute code

-1

ठीक है, आप समानांतर धागे का एक गुच्छा लिख ​​सकते हैं, जिनमें से प्रत्येक अपनी संबंधित स्थिति के लिए सर्वेक्षण करता है। मुझे लगता है कि यह एक कम प्रदर्शन वाला अनुप्रयोग होगा, लेकिन यह संभव है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.