मैं एक सी ++ आवेदन में घटनाओं को लागू करने के लिए विभिन्न दृष्टिकोणों पर विचार कर रहा हूं। एक अधिसूचना केंद्र के माध्यम से एक केंद्रीकृत घटना प्रेषण को लागू करने के लिए एक सुझाव है। कार्यक्रमों के स्रोतों और लक्ष्यों के लिए एक विकल्प सीधे संवाद करने के लिए होगा। हालांकि, मुझे अधिसूचना केंद्र दृष्टिकोण के बारे में आरक्षण है। जैसा कि मैंने उन्हें देखा है, मैं दोनों दृष्टिकोणों की रूपरेखा तैयार करूंगा (मैं उनके बारे में कुछ गलत समझ सकता हूं, मैंने पहले कभी ईवेंट हैंडलिंग लागू नहीं किया है)।एक केंद्रीकृत घटना प्रेषण के पेशेवरों और विपक्ष
ए) प्रत्यक्ष संचार। घटनाक्रम उनके स्रोत के इंटरफेस का हिस्सा हैं। , मैं क्या समझ से
struct Source
{
Event</*some_args_here*/> InterestingEventA;
Event</*some_other_args_here*/> InterestingEventB;
};
class Target
{
public:
void Subscribe(Source& s)
{
s.InterestingEventA += CreateDelegate(&MyHandlerFunction, this);
}
private:
void MyHandlerFunction(/*args*/) { /*whatever*/ }
};
(को बढ़ावा देने :: संकेतों, क्यूटी संकेत/स्लॉट और: घटना में रुचि रखने वाले वस्तुओं किसी भी तरह स्रोत वर्ग का एक उदाहरण पर भी नियंत्रण प्राप्त है और इसकी घटना (रों) की सदस्यता चाहिए। नेट घटनाएं इस तरह काम करती हैं, लेकिन मैं गलत हो सकता हूं।)
बी) अधिसूचना केंद्र। घटनाएं उनके स्रोत के इंटरफ़ेस में दिखाई नहीं दे रही हैं। सभी घटनाएं कुछ अधिसूचना केंद्र पर जाती हैं, जो शायद एक सिंगलटन के रूप में लागू होती हैं (इससे बचने पर किसी भी सलाह की सराहना की जाएगी), क्योंकि उन्हें निकाल दिया जाता है। लक्षित वस्तुओं को स्रोतों के बारे में कुछ भी नहीं पता है; वे अधिसूचना केंद्र तक पहुंचकर कुछ घटना प्रकारों की सदस्यता लेते हैं। एक बार अधिसूचना केंद्र को एक नया कार्यक्रम प्राप्त हो जाने पर, यह उस विशेष घटना में रुचि रखने वाले सभी ग्राहकों को सूचित करता है।
class NotificationCenter
{
public:
NotificationCenter& Instance();
void Subscribe(IEvent& event, IEventTarget& target);
void Unsubscribe(IEvent& event, IEventTarget& target);
void FireEvent(IEvent& event);
};
class Source
{
void SomePrivateFunc()
{
// ...
InterestingEventA event(/* some args here*/);
NotificationCenter::Instance().FireEvent(event);
// ...
}
};
class Target : public IEventTarget
{
public:
Target()
{
NotificationCenter::Instance().Subscribe(InterestingEventA(), *this);
}
void OnEvent(IEvent& event) override {/**/}
};
(मैं पोको, जो, जहाँ तक मैं समझता हूँ, दोनों दृष्टिकोण को लागू करता है से शब्द "अधिसूचना केंद्र" लिया)।
मैं इस दृष्टिकोण के लिए कुछ पेशेवर देख सकता हूं; लक्ष्य के लिए अपनी सदस्यता बनाने के लिए यह आसान होगा क्योंकि उन्हें स्रोतों तक पहुंच की आवश्यकता नहीं होगी। इसके अलावा, जीवन भर में प्रबंधन की कोई समस्या नहीं होगी: स्रोतों के विपरीत, अधिसूचना केंद्र हमेशा लक्ष्यों को पार कर जाएगा, इसलिए वे हमेशा अपने विनाशकों में सदस्यता छोड़ने का लक्ष्य रखते हैं, इस पर चिंता किए बिना कि स्रोत अभी भी मौजूद है (यह एक प्रमुख बात है जिसे मैं प्रत्यक्ष रूप से देख सकता हूं संचार)। हालांकि, मुझे डर है कि इस दृष्टिकोण unmaintainable कोड को जन्म दे सकता हूँ, क्योंकि:
घटनाओं के सभी प्रकार, शायद पूरी तरह से एक दूसरे से संबंधित नहीं है, यह एक बड़ा सिंक करने के लिए जाना होगा।
अधिसूचना केंद्र को लागू करने का सबसे स्पष्ट तरीका एक सिंगलटन के रूप में है, इसलिए यह ट्रैक करना मुश्किल होगा कि ग्राहकों की सूची में कौन और कब संशोधित होता है।
घटनाक्रम किसी भी इंटरफ़ेस में दिखाई नहीं दे रहे हैं, इसलिए यह देखने का कोई तरीका नहीं है कि कोई विशेष ईवेंट किसी भी स्रोत से संबंधित है या नहीं।
इन विपक्ष का एक परिणाम के रूप में, मुझे डर है कि के रूप में आवेदन बढ़ता है यह वस्तुओं के बीच कनेक्शन को ट्रैक करना बहुत मुश्किल हो जाएगा (मैं क्यों कुछ विशेष घटना आग नहीं है समझने की कोशिश कर समस्याओं की कल्पना कर रहा हूँ कर रहा हूँ , उदाहरण के लिए)।
मैं "अधिसूचना केंद्र" दृष्टिकोण के पेशेवरों और विपक्ष के बारे में सलाह ढूंढ रहा हूं। क्या यह बरकरार है? क्या यह हर तरह के अनुप्रयोगों में फिट है? शायद कार्यान्वयन में सुधार करने के तरीके हैं? मैंने वर्णित दो दृष्टिकोणों के साथ तुलना, साथ ही साथ किसी अन्य घटना प्रबंधन सुझावों का भी स्वागत है।
आपको कुछ डिज़ाइन जानकारी देना चाहिए, आपकी प्रदर्शन बाधाएं, कनेक्शन की संख्या और मल्टीथ्रेडिंग विशेष रूप से क्या होनी चाहिए। आम तौर पर केंद्रीकृत दृष्टिकोण प्रबंधक के लिए आसान है जो मुझे लगता है। – dzada
@dzada, कोई multithreading नहीं। कनेक्शन की संख्या अभी लगभग सौ है, लेकिन मुझे लगता है कि अगर सब्सक्रिप्शन बनाना संभव हो जाए तो यह तेजी से बढ़ेगा, शायद 2 या 3 सौ। आवेदन एक छोटा सा खेल है, इसलिए प्रदर्शन महत्वपूर्ण है; हालांकि, अभी तक, घटनाएं गंभीर प्रदर्शन चिंताओं के कारण अक्सर ट्रिगर नहीं होती हैं। – user2478832
यहां एक समान प्रश्न है। http://programmers.stackexchange.com/questions/22528/does-notification-center-pattern-encourage-good-or-bad-program- डिज़ाइन – ZijingWu