मैं कुछ संदेश हैंडलिंग कोड लिख रहा हूं, जिससे प्रत्येक संदेश एक पीओडी संरचना है।इंटरफेस को परिभाषित करने के लिए mpl :: legisl_linearly का उपयोग करने के प्रभाव
class AbstractHandler
{
public:
virtual void handleMessage(const MessageType1& msg) =0;
virtual void handleMessage(const MessageType2& msg) =0;
virtual void handleMessage(const MessageType3& msg) =0;
virtual void handleMessage(const MessageType4& msg) =0;
};
और फिर व्युत्पन्न बनाने ठोस वर्ग कि हैंडलर कार्यों को लागू:
class ConcreteHandler : public AbstractHandler
{
public:
virtual void handleMessage(const MessageType1& msg);
virtual void handleMessage(const MessageType2& msg);
virtual void handleMessage(const MessageType3& msg);
virtual void handleMessage(const MessageType4& msg);
};
यदि यह लिखने के रास्ते में प्रत्येक संदेश प्रकार उदाहरण के लिए आभासी functiosn साथ, एक सार आधार वर्ग को परिभाषित करने के होगा सिस्टम AbstractHandler
में नए संदेश जोड़े गए हैं सभी व्युत्पन्न प्रकारों के साथ अपडेट किया जाना चाहिए।
वैकल्पिक रूप से मैं mpl
अनुक्रम में सभी समर्थित संदेश प्रकारों को पकड़ सकता हूं, और सार आधार वर्ग उत्पन्न करने के लिए mpl::inherit_linearly
का उपयोग कर सकता हूं।
(नोट: मैं पहले से ही कोड में कहीं और संदेश प्रकारों के mpl::vector
का उपयोग करें।)
उदाहरण के लिए:
typedef mpl::vector< MessageType1, MessageType2,
MessageType3, MessageType4 > message_types;
template< class Message >
class Wrapper
{
public:
virtual void handleMessage(const Message& msg) = 0;
protected:
~Wrapper(){}
};
class AbstractHandler
: public mpl::inherit_linearly< message_types
, mpl::inherit< mpl_1, Wrapper<mpl::_2> >
>::type
{
public:
virtual ~AbstractHandler() {}
};
कंक्रीट संचालकों तो AbstractHandler
से निकाले जाते हैं। इसका अर्थ यह है कि जब भी सिस्टम में नए संदेश प्रकार जोड़े जाते हैं तो यह mpl::vector<types...> message_types
अनुक्रम को बदलने का मामला है, जो व्युत्पन्न कक्षाओं में नए handleMessage
फ़ंक्शंस जोड़ना जोड़ता है।
मेरी राय में इस लंबी अवधि के रखरखाव कम कर देता है, के बाद से AbstractHandler स्वचालित रूप से प्रदर्शन के संदर्भ में mpl::vector message_types
में सभी संदेशों के लिए शुद्ध आभासी कार्यों होगा कि इस दृष्टिकोण का उपयोग करने के लिए किसी भी कमियां हैं?
अमूर्त बेस कक्षाएं उत्पन्न करने के लिए mpl::inherit_linearly
का उपयोग करने के प्रभाव क्या हैं?
इस पर मेरे विचारों की पुष्टि करने के लिए धन्यवाद। अब मेरे पास एक कामकाजी समाधान है जो एक एपीआई का हिस्सा है जो क्लाइंट सेवाओं को संदेश संसाधित करते समय उपयोग करता है। अब तक एपीआई जैसे सभी उपयोगकर्ता ... एमपीएल निश्चित रूप से मजबूत कोड का उत्पादन करने में मदद करता है ... – mark
उपयोगकर्ता की तरफ इसके कुछ दोष हैं हालांकि: यह कम स्पष्ट है कि कार्यों को परिभाषित किया जाना चाहिए। एक अच्छा (हालिया) कंपाइलर एक स्पष्ट संदेश देगा, इसलिए मुझे लगता है कि यह ठीक है। यह बेहतर होगा यदि उपयोगकर्ता को कार्यों को स्पष्ट रूप से ओवरराइड करने के लिए मजबूर करने का कोई तरीका था (यह सुनिश्चित करने के लिए कि वे गलतियां नहीं करते हैं)। – Klaim