2010-02-24 15 views
22

पर हम क्यूटी का उपयोग कर रहे हैं जो सिग्नल और स्लॉट प्रदान करता है जो मुझे वास्तव में सुविधाजनक लगता है। हालांकि, महान शक्ति के साथ बड़ी ज़िम्मेदारी आती है और मुझे लगता है कि इस सुविधा का बहुत दुरुपयोग करना बहुत आसान है।सिग्नल और स्लॉट का उपयोग कब करें और

क्या सिग्नल-स्लॉट उपयोग के लिए कोई सर्वोत्तम अभ्यास है? मुझे इस तरह से कुछ सामान्य दिशानिर्देश खोजने में मुश्किल हो रही है। कुछ प्रश्न (मेरे पास स्पष्ट राय है, लेकिन मेरी टीम के सभी सदस्य इस बात से सहमत नहीं हैं):

  • त्रुटियों की रिपोर्ट करने के लिए सिग्नल का उपयोग करना ठीक है?
  • क्या यह मानना ​​ठीक है कि एक सिग्नल संभाला जाएगा?
  • क्रियाओं को शुरू करने के लिए संकेतों का उपयोग किया जा सकता है? जैसे signal displayInfoScreen() को एक स्लॉट द्वारा संभाला जाना चाहिए जो एक जानकारी स्क्रीन दिखाता है।

संकेतों को कब/उपयोग नहीं किया जाना चाहिए, इस पर कोई अन्य राय बहुत आपका स्वागत है!

उत्तर

12

यह
त्रुटियों की रिपोर्ट करने के लिए संकेतों का उपयोग करना ठीक है?

हां, उदाहरण के लिए, क्यूएफटीपी देखें, जहां किए गए सिग्नल में स्थिति होती है। इसमें वास्तविक त्रुटि नहीं होती है, केवल एक त्रुटि होती है जो एक त्रुटि हुई है।

क्या यह मानना ​​ठीक है कि एक संकेत संभाला जाएगा?

नहीं। प्रेषक कभी यह नहीं मान सकता कि, आपका विशेष आवेदन इस पर निर्भर हो सकता है। उदाहरण के लिए, फ़ाइल का प्रतिनिधित्व करने वाला क्यूएक्शन आवेदन के लिए आवेदन करने के लिए नई जरूरतों को संभालने की जरूरत है, लेकिन क्यूएक्शन ऑब्जेक्ट कम परवाह नहीं कर सका।

कार्रवाइयों को शुरू करने के लिए सिग्नल का उपयोग किया जा सकता है? जैसे सिग्नल displayInfoScreen() को द्वारा एक स्लॉट द्वारा संभाला जाना चाहिए जो एक जानकारी स्क्रीन दिखाता है।

फिर, हाँ, उदाहरण के लिए QAction ऑब्जेक्ट। लेकिन यदि आप घटकों का पुन: उपयोग करने में सक्षम होना चाहते हैं, तो आपको यह सुनिश्चित करने के लिए सावधान रहना चाहिए कि वास्तविक वर्ग इस पर निर्भर नहीं है।

+0

इस उत्तर के रूप में स्वीकृत Qt में उपयोग के सादे उदाहरण प्रदान किए गए। क्या आपको लगता है कि त्रुटियां ठीक हैं, लेकिन केवल तभी जब प्रक्रिया अतुल्यकालिक है? – larsmoa

+0

धन्यवाद! और, हां, अन्यथा, या तो स्थिति वापसी मान, या स्थिति तर्क जोड़ें (QString :: toInt करता है)। – e8johan

10

क्या यह मानना ​​ठीक है कि एक संकेत संभाला जाएगा?

नहीं, यह नहीं है। सिग्नल अग्नि-और-भूल प्रकार की चीजें हैं। कौन सिग्नल से जुड़ता है और यह क्या करता है एमिटर की चिंता नहीं होनी चाहिए।

3

सिग्नल/स्लॉट (ईवेंट भी कहा जाता है) ऑब्जेक्ट्स के बीच युग्मन को हटाने का एक अच्छा तरीका है।

उदाहरण के लिए, मॉडल को कैसे काम करता है, और जब मॉडल बदलता है, तो वे मॉडल को "सुनते" देखते हैं। यह मॉडल कहने के लिए जिम्मेदार है कि यह कब बदलता है, क्या परिवर्तन होता है।

घटनाओं के साथ समस्या तब होती है जब आप क्लाइंट आवश्यकताओं के साथ अपनी घटनाओं को डिज़ाइन करते हैं। उदाहरण के लिए, आपके पास सिग्नल displayInfoScreen नहीं होना चाहिए क्योंकि यह इस सिग्नल का उपयोग करके ऑब्जेक्ट्स के बारे में कुछ मानता है। इसके बजाय, यह infoChanged होना चाहिए और InfoScreenDisplayer स्क्रीन पर इसे प्रदर्शित करने के लिए इस संकेतों को सुनता है। यदि आपको आवश्यकता है, तो आप बाद में InfoTweeterPoster जोड़ सकते हैं जो जब भी वे बदलते हैं तो ट्वीटर पर जानकारी पोस्ट करें।

+6

आप a.k.a. ईवेंट लिखते हैं, लेकिन यह सच नहीं है। क्यूटी एक अलग घटना बुनियादी ढांचे के साथ आता है। – e8johan

11

सिग्नल और स्लॉट शक्तिशाली हैं क्योंकि वस्तुएं decouples। आप यह नहीं मान सकते कि एक सिग्नल में एक स्लॉट जुड़ा हुआ है, जैसा कि पहले उत्तर दिया गया था।

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

5

त्रुटियों की रिपोर्ट करने के लिए सिग्नल का उपयोग करना ठीक है?

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

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

क्या यह मानना ​​ठीक है कि एक संकेत संभाला जाएगा?

सिग्नल (दार्शनिक रूप से) यह इंगित करने के लिए डिज़ाइन किए गए हैं कि कुछ हुआ है। जैसा कि अन्य ने संकेत दिया है, यह मानना ​​कभी भी अच्छा विचार नहीं है कि एक सिग्नल स्लॉट से मेल खाता है, या यहां तक ​​कि एक अन्य स्लॉट के साथ भी।

क्रियाओं को शुरू करने के लिए संकेतों का उपयोग किया जा सकता है? जैसे सिग्नल डिस्प्लेइन्फोस्क्रीन() को एक स्लॉट द्वारा संभाला जाना चाहिए जो एक सूचना स्क्रीन दिखाता है।

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

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