को तत्काल करने के लिए सही उप-वर्ग का चयन करना ठीक है, संदर्भ कुछ क्रमिकरण/deserialization कोड है जो एक बाइट स्ट्रीम को 'ऑब्जेक्ट' प्रतिनिधित्व में पार्स करेगा जो (और इसके विपरीत) के साथ काम करना आसान है।प्रोग्रामेटिक रूप से
यहाँ एक आधार संदेश वर्ग के साथ एक सरल उदाहरण है और फिर एक 'प्रकार' शीर्षक पर निर्भर करता है, कुछ और डेटा/समारोह मौजूद हैं और हम का दृष्टांत का अधिकार उपवर्ग का चयन करना होगा:
class BaseMessage {
public:
enum Type {
MyMessageA = 0x5a,
MyMessageB = 0xa5,
};
BaseMessage(Type type) : mType(type) { }
virtual ~BaseMessage() { }
Type type() const { return mType; }
protected:
Type mType;
virtual void parse(void *data, size_t len);
};
class MyMessageA {
public:
MyMessageA() : BaseMessage(MyMessageA) { }
/* message A specific stuf ... */
protected:
virtual void parse(void *data, size_t len);
};
class MyMessageB {
public:
MyMessageB() : BaseMessage(MyMessageB) { }
/* message B specific stuf ... */
protected:
virtual void parse(void *data, size_t len);
};
कोई वास्तविक में उदाहरण, सैकड़ों अलग-अलग संदेश प्रकार और संभवतः कई स्तर या पदानुक्रम होंगे क्योंकि कुछ संदेश एक-दूसरे के साथ फ़ील्ड/फ़ंक्शंस साझा करते हैं।
अब, एक बाइट स्ट्रिंग पार्स करने में, मैं की तरह कुछ कर रहा हूँ:
BaseMessage *msg = NULL;
Type type = (Type)data[0];
switch (type) {
case MyMessageA:
msg = new MyMessageA();
break;
case MyMessageB:
msg = new MyMessageB();
break;
default:
/* protocol error */
}
if (msg)
msg->parse(data, len);
लेकिन मैं इस विशाल स्विच बहुत ही सुंदर नहीं मिल रहा है, और मैं जानकारी के बारे में जो संदेश जो 'प्रकार है है मूल्य 'दो बार (एक बार कन्स्ट्रक्टर में, एक बार इस स्विच में) यह भी काफी लंबा है ...
मैं एक बेहतर तरीका ढूंढ रहा हूं जो बेहतर होगा ... क्या किसी को पता है कि कैसे सुधार करना है इस ?
वास्तव में बहुत ही रोचक दृष्टिकोण। रनटाइम बदलाव पहलू मेरे विशिष्ट मामले में वास्तव में उपयोगी नहीं है लेकिन यह एक अच्छा बोनस है जो कुछ अन्य मामलों में उपयोगी साबित हो सकता है। मैं थोड़ी देर के लिए इंतजार करूँगा अगर कोई और उत्तर देने की पुष्टि करने से पहले है। – 246tNt
जाहिर है आप रनटाइम पर संदेश प्रकार नहीं जोड़ सकते हैं। वैसे भी, स्विच केस को मानचित्र में प्रति संदेश प्रकार पंजीकरण प्रविष्टि में एक पंक्ति में बदल दिया गया है, यहां बड़ी जीत नहीं दिखाई दे रही है, निश्चित रूप से परिणामी कोड की कोई कम मात्रा नहीं, और अधिक कुशल? शायद कम अव्यवस्था? –
मैं बहुत चिंतित नहीं हूं, मैं प्रति सेकंड सैकड़ों हजारों संदेशों को संसाधित नहीं कर रहा हूं, कोड शैली यहां अधिक चिंता का विषय है। यह भी जीत मैं यहां देखता हूं (भले ही प्रश्न से स्पष्ट न हो), यह है कि अगर मैं इस तरह की अन्य चीज़ की ज़रूरत है, तो मैं 'createMessage' की तुलना में अन्य विधियों को भी जोड़ सकता हूं, जैसे परिभाषित करना कि 'नियंत्रण वर्ग' कौन सा संभाल लेगा संदेश और सामान। रनटाइम बदलाव के लिए: आप रनटाइम पर मानचित्र को संशोधित कर सकते हैं। नए संदेश जोड़ने के लिए आप उन्हें साझा वस्तुओं जैसे प्लगइन्स और इस तरह से डाउनलोड कर सकते हैं। – 246tNt