अच्छा प्रश्न! इससे पहले कि मैं आपके द्वारा पूछे गए विशिष्ट प्रश्नों पर पहुँचूँ, मैं कहूँगा: सादगी की शक्ति को कम मत समझना। तपन सही है। ध्यान रखें कि आप इन दृष्टिकोणों के साथ क्या करने की कोशिश कर रहे हैं, किसी कॉल को टालने या कॉल करने वाले को कॉलली से हटाने का एक सुंदर तरीका है। मैं उन समस्याओं में से कुछ को दूर करने के लिए आश्चर्यजनक रूप से सहज तरीके से कोरटाइन की सिफारिश कर सकता हूं, लेकिन यह थोड़ा बंद विषय है। कभी-कभी, आप केवल फ़ंक्शन को कॉल करने से बेहतर हैं और इस तथ्य के साथ रहते हैं कि इकाई A सीधे इकाई बी से युग्मित है। देखें YAGNI।
उस ने कहा, मैंने सरल संदेश पासिंग के साथ संयुक्त सिग्नल / स्लॉट मॉडल का उपयोग किया है और खुश हूं। मैंने इसे C ++ और Lua में एक काफी सफल iPhone शीर्षक के लिए उपयोग किया, जिसमें बहुत ही टाइट शेड्यूल था।
सिग्नल / स्लॉट मामले के लिए, अगर मैं चाहता हूं कि ए कुछ बी के जवाब में कुछ करने के लिए इकाई ए करे (जैसे कुछ मर जाता है तो एक दरवाजा अनलॉक करें) मेरे पास इकाई ए हो सकता है सीधे इकाई बी की मौत की घटना के लिए सदस्यता लें। या संभवतः संस्था ए प्रत्येक संस्थाओं के एक समूह को सदस्यता देगी, प्रत्येक घटना पर एक काउंटर बढ़ाएँ और एन के मरने के बाद दरवाजा अनलॉक करें। इसके अलावा, "संस्थाओं का समूह" और "उनमें से एन" आमतौर पर स्तर के डेटा में परिभाषित डिजाइनर होंगे। (एक तरफ के रूप में, यह एक ऐसा क्षेत्र है, जहां से कोरटाइन वास्तव में चमक सकते हैं, उदाहरण के लिए, WaitForMultiple ("डाइंग", enta, entB, entC); door.Unlock ();)
लेकिन यह बोझिल हो सकता है जब यह उन प्रतिक्रियाओं की बात आती है जो कसकर सी ++ कोड, या स्वाभाविक रूप से अल्पकालिक खेल की घटनाओं के लिए युग्मित हैं: नुकसान से निपटना, हथियारों को फिर से लोड करना, डिबगिंग, खिलाड़ी द्वारा संचालित स्थान-आधारित एआई प्रतिक्रिया। यह वह जगह है जहां संदेश गुजर अंतराल में भर सकता है। यह अनिवार्य रूप से कुछ इस तरह उबालता है, "इस क्षेत्र की सभी संस्थाओं को 3 सेकंड में नुकसान उठाने के लिए कहें," या "जब भी आप भौतिकी को पूरा करते हैं कि मैंने किसको गोली मारी, तो उन्हें इस स्क्रिप्ट फ़ंक्शन को चलाने के लिए कहें।" यह पता लगाना मुश्किल है कि पब्लिश / सब्सक्राइब या सिग्नल / स्लॉट का उपयोग करते हुए कैसे करें।
यह आसानी से ओवरकिल हो सकता है (बनाम टेनप का उदाहरण)। यदि आपके पास बहुत सारी कार्रवाई है तो यह अक्षम्य ब्लोट भी हो सकता है। लेकिन इसकी कमियों के बावजूद, यह "संदेश और घटना" दृष्टिकोण स्क्रिप्टेड गेम कोड (उदाहरण के लिए लुआ) के साथ बहुत अच्छी तरह से मेल खाता है। स्क्रिप्ट कोड अपने स्वयं के संदेशों और घटनाओं को C ++ कोड की परवाह किए बिना परिभाषित और प्रतिक्रिया कर सकता है। और स्क्रिप्ट कोड आसानी से संदेश भेज सकता है जो C ++ कोड को ट्रिगर करता है, जैसे कि स्तर बदलना, आवाज़ बजाना, या यहां तक कि एक हथियार को सेट करने देना कि टेकडैम संदेश कितना नुकसान पहुँचाता है। इसने मुझे एक टन बचाया क्योंकि मैं लगातार लुबिन्द के साथ बेवकूफ नहीं बना रहा था। और इसने मेरे सभी ल्यूबाइंड कोड को एक जगह पर रखने दिया, क्योंकि इसमें बहुत कुछ नहीं था। जब ठीक से युग्मित,
इसके अलावा, उपयोग के मामले # 2 के साथ मेरा अनुभव यह है कि आप इसे दूसरी दिशा में एक घटना के रूप में संभालने से बेहतर हैं। यह पूछने के बजाय कि इकाई की सेहत क्या है, जब भी स्वास्थ्य में कोई महत्वपूर्ण परिवर्तन होता है, तो किसी घटना / संदेश को आग लगा दें।
इंटरफेस, btw के संदर्भ में, मैं इस सब को लागू करने के लिए तीन वर्गों के साथ समाप्त हुआ: EventHost, EventClient, और MessageClient। EventHosts स्लॉट्स बनाते हैं, EventClients उनकी सदस्यता लेते हैं / उनसे कनेक्ट होते हैं, और MessageClients एक प्रतिनिधि को एक संदेश के साथ जोड़ते हैं। ध्यान दें कि MessageClient का प्रतिनिधि लक्ष्य आवश्यक रूप से उसी वस्तु का होना आवश्यक नहीं है जो एसोसिएशन का मालिक है। दूसरे शब्दों में, MessageClients अन्य वस्तुओं के संदेशों को अग्रेषित करने के लिए पूरी तरह से मौजूद हो सकते हैं। FWIW, होस्ट / क्लाइंट रूपक अनुचित का प्रकार है। स्रोत / सिंक बेहतर अवधारणा हो सकती है।
क्षमा करें, मैं थोमा वहाँ rambled। यह मेरा पहला उत्तर है :) मुझे आशा है कि यह समझ में आया।