Tamam, bu bağlamda, bir bayt akışını, çalışması daha kolay olan bir 'nesne' temsiline ayıracak bazı serileştirme/serileştirme kodudur (ve tam tersi).Programatik olarak başlatmak için doğru alt sınıfı seçme
Burada taban mesajı sınıf ile basitleştirilmiş bir örnek ve daha sonra bir 'türünün' başlığının bağlı olarak bazı daha fazla veri/fonksiyon mevcut ve biz örneğini sağ alt sınıfını seçmelisiniz:
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);
};
gerçek olarak Bazı mesajlar birbirleriyle alanları/fonksiyonları paylaştığı için yüzlerce farklı mesaj türü ve muhtemelen birkaç seviye veya hiyerarşi olacaktır. Şimdi
, bir bayt dizesini ayrıştırmak için, şöyle bir şey yapıyorum: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);
Ama bu büyük anahtarı çok şık bulmuyorum, ben mesajı hangi 'türü olan hakkında bilgi sahibi değer 'iki kez (bir kez bu kurucuda bir, bu geçişte bir tane) Ayrıca oldukça uzun bir ...
Sadece daha iyi olurdu daha iyi bir yol arıyorum ... Herkes nasıl bir fikir geliştirmek için var mı bu ?
Gerçekten çok ilginç bir yaklaşım. Çalışma zamanı değişikliği özelliği, özel durumumda gerçekten yararlı değil, ancak diğer bazı durumlarda yararlı olabileceğini gösteren hoş bir bonus. Yanıt olarak onaylanmadan önce başka birinin olup olmadığını biraz bekleyeceğim. – 246tNt
Açıkçası, çalışma zamanında mesaj türleri ekleyemezsiniz. Her neyse, anahtar durumu haritaya kayıt tipi kaydı girişi başına bir satıra dönüştürüldü, burada büyük kazanmayı görmüyoruz, sonuçta ortaya çıkan kod daha az miktarda, daha verimli mi? Muhtemelen daha az dağınıklık? –
Performans açısından çok endişelenmiyorum, saniyede yüz binlerce iletiyi işleyemiyorum, kod stili burada daha fazla endişe kaynağı. Ayrıca burada gördüğüm (sorudan açıkça anlaşılmasa bile) kazan, 'kontrol sınıfı' tanımlamak gibi, sıralamadaki başka bir şeye ihtiyacım varsa, 'createMessage' den başka yöntemler de ekleyebilirim. mesaj ve şeyler. Çalışma zamanı değişikliği için: Haritayı çalışma zamanında değiştirebilirsiniz. Yeni mesajlar eklemek için bunları eklentiler ve benzeri gibi paylaşılan nesnelerden indirebilirsiniz. – 246tNt