GUI प्रोग्रामिंग के लिए सिग्नल + स्लॉट मॉडल का कोई व्यावहारिक विकल्प?


9

जीयूआई टूलकिट के अधिकांश आजकल सिग्नल + स्लॉट मॉडल का उपयोग करते हैं। यह क्यूटी और जीटीके + था, अगर मैं गलत नहीं हूं, तो इसका नेतृत्व किसने किया।

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

अब तक इस डिज़ाइन का उपयोग अधिकांश आधुनिक टूलकिट में किया जा रहा है जहाँ तक मुझे पता है। वहाँ Qt, GTK +, FLTK आदि जावा स्विंग हैं। C # के पास इसके लिए एक भाषा सुविधा (ईवेंट और डेलिगेट्स) भी है, और इस डिज़ाइन पर विंडोज फॉर्म विकसित किए गए हैं। वास्तव में, पिछले एक दशक में, GUI प्रोग्रामिंग के लिए यह डिजाइन एक तरह का अलिखित मानक बन गया है। चूंकि यह उत्पादकता बढ़ाता है और अधिक से अधिक अमूर्तता प्रदान करता है।

हालांकि, मेरा सवाल यह है:

क्या कोई वैकल्पिक डिजाइन है, जो आधुनिक जीयूआई प्रोग्रामिंग के लिए समानांतर या व्यावहारिक है?

यानी सिग्नल + स्लॉट्स डिजाइन, शहर में एकमात्र व्यावहारिक है? क्या जीयूआई प्रोग्रामिंग किसी अन्य डिजाइन के साथ करना संभव है ? क्या कोई आधुनिक (अधिमानतः सफल और लोकप्रिय) जीयूआई टूलकिट एक वैकल्पिक डिजाइन पर बनाया गया है?


संदेश पंक्ति प्रतिमान जो आपको Windows API में मिलता है, वह ईवेंट और डेलिगेट्स की तरह नहीं है । प्रतिनिधियों तुल्यकालिक और तुरंत कहा जाता है, की तरह std::function, नहीं एक अतुल्यकालिक संकेत। इसके अलावा, WinAPI है प्रदान करते हैं DefWindowProcजो एक डिफ़ॉल्ट कार्यान्वयन के रूप में विंडोज संदेशों संसाधित करता है। इसलिए मैं मानता हूं कि आपका प्रश्न त्रुटिपूर्ण तर्क पर आधारित है।
15-16 बजे डेडएमजी

2
क्यूटी और जीटीके + पहले जीयूआई फ्रेमवर्क को देखने से दूर हैं जो एक इवेंट संचालित दृष्टिकोण का उपयोग कर रहे थे। अवधारणा स्मॉलटाक -80 ( en.wikipedia.org/wiki/Smalltalk ) पर वापस पहुंचती है ।
Doc Brown

दिलचस्प सवाल, मैं उत्सुक हूँ अगर यह मॉडल मल्टी-टच इंटरफेस के साथ बहुत बदल जाता है।
बेन डीमोट

मैं उदार होऊंगा और मानूंगा कि वह SendMessage के बारे में जानता है, जो कि केवल PostMessage नहीं, बल्कि सिंक्रोनस है। हालाँकि, वह अभी भी गलत है कि आपको हर संदेश के लिए संपूर्ण संदेश-हैंडलिंग लूप लिखना नहीं पड़ा।
gbjbaanb

जावाएफएक्स अपने बाइंडिंग एपीआई के माध्यम से एक समान तंत्र प्रदान करता है।
Eng.Fouad 12

जवाबों:


7

हालांकि मैं यह सब फोन नहीं होगा कि लोकप्रिय, वहाँ हमेशा है प्रतिक्रियाशील प्रोग्रामिंग GUIs के लिए, विशेष रूप से कार्यात्मक प्रतिक्रियाशील प्रोग्रामिंग , कार्यान्वित के रूप में, उदाहरण के लिए, द्वारा नेट आरएक्स फ्रेमवर्क कुछ अधिक गूढ़ भाषाओं / प्लेटफार्मों में, साथ ही साथ कई उपकरणकिटें द्वारा , जैसे प्रतिक्रियाशील-केला या FrTime , के लिए हास्केल और रैकेट क्रमशः।


5

यह मेरा एक पसंदीदा विषय है, और लगभग एक दशक ('० से mine mine६) तक मैंने सोचा था कि एक जीयूआई जिसमें वस्तुओं का समावेश होता है जो घटनाओं पर प्रतिक्रिया करता है, यह करने का सही तरीका था।

तब मैं एक और तरीका यह करने के लिए पर ठोकर खाई यहाँ वर्णित है और एक sourceforge परियोजना के साथ यहाँ

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

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

PS मैंने केवल डेस्कटॉप UI और रिमोट टर्मिनल UI के लिए किया है, वेब ब्राउज़र UI के लिए नहीं। मुझे यकीन है कि यह संभव है, लेकिन मुझे इसे आज़माने का मौका नहीं मिला।


+1, लेकिन उपयोगकर्ता परिभाषित इनपुट जैसे अतिरिक्त कार्यक्षमता प्राप्त करना कैसे संभव है?
अपरेंटिसहैकर

@IntermediateHacker: मुझे यकीन नहीं है कि उपयोगकर्ता परिभाषित इनपुट से आपका क्या मतलब है। क्या आपका मतलब फॉर्म-डिज़ाइनर ऐप है?
माइक डनलैवी

2

खैर, इस बारे में जाने के दो अलग-अलग तरीके हैं:

  1. हर विजेट एक ग्रैन्यूलर सदस्यता तंत्र (सिग्नल / स्लॉट, ऑब्जर्वर / ऑब्जर्वेबल, इवेंट / डेलिगेट) को उजागर करें और क्लाइंट कोड की सदस्यता लें और तदनुसार कार्रवाई करें।
  2. निर्मित डेटा के अमूर्त के खिलाफ एक विजेट बनाया और ग्राहक कोड लागू किया है कि अमूर्त।

यहाँ दूसरे दृष्टिकोण के लिए एक उदाहरण दिया गया है:

interface Action {
     void execute();
     Bool isEnabled();
     Null<String> description();//used for tooltip
}
interface LabledAction extends Action {
     String getName();
}

और अब आप एक के LabelButtonखिलाफ निर्माण कर सकते हैं LabledActionऔर ग्राहक कोड बस इसे लागू कर सकते हैं या कुछ सामान्य डिफ़ॉल्ट कार्यान्वयन का उपयोग कर सकते हैं, यदि उपलब्ध हो और उपयुक्त हो।

एक तरह से दूसरा दृष्टिकोण कम लचीला है, लेकिन अधिक कठोर है। आप अपेक्षाकृत परमाणु साधनों के माध्यम से मॉडल के साथ दृश्य को केवल किसी तरह तार नहीं करते हैं। आप अपनी आवश्यकताओं के आधार पर एक उपयुक्त जीयूआई डिज़ाइन करते हैं और फिर आप उस जीयूआई और आपके डोमेन / एप्लिकेशन लॉजिक के बीच एडेप्टर लागू करते हैं।


मॉडल / दृश्य / नियंत्रक अच्छा है, लेकिन यह पर्यवेक्षक पैटर्न का सिर्फ एक विस्तार है, क्योंकि नियंत्रक भाग विजेट का केवल एक पर्यवेक्षक है और मॉडल भाग में विजेट मॉडल का पर्यवेक्षक है, इसलिए यह उसी तरह का एक तंत्र है ।
Jan Hudec

1

कुछ नियंत्रण प्रकार सिस्टम एक डेटाबेस दृष्टिकोण का उपयोग करते हैं - प्रत्येक गुई नियंत्रण डेटाबेस में एक फाइल से जुड़ा होता है ताकि गुई हमेशा डेटाबेस स्थिति को दर्शाता है। डीबी हुक का उपयोग फ़ंक्शन को ट्रिगर करने के लिए किया जाता है जब एक मूल्य बदलता है।


4
क्या यह अभी भी एक अतिरिक्त DB परत के साथ सिग्नल-स्लॉट नहीं है?
शाफ़्ट फ्रिक

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