Dolayısıyla, çok sayıda pakete sahip olmayı planlıyorsanız, bu günlerde bellek gerçekten büyük bir maliyet değil ve diziler oldukça hızlı. Ayrıca, bir atlama tablosunu otomatik olarak oluşturmak için bir switch ifadesine güvenemezsiniz ve bu nedenle, atlama tablosu senaryosunu kendiniz oluşturmak daha kolaydır. Aşağıdaki örnekte görebileceğiniz gibi, maksimum 255 paket varsayıyoruz.
Aşağıdaki sonucu elde etmek için ihtiyacınız olan soyutlama .. Bunun nasıl çalıştığını açıklamayacağım, umarım bunu anlarsınız.
Bunu, paket boyutunu 255'e ayarlamak için güncelledim, daha fazlasına ihtiyacınız varsa, daha sonra sınır kontrolü yapmanız gerekecek (id <0) || (id> uzunluk).
Packets[] packets = new Packets[255];
static {
packets[0] = new Login(6);
packets[2] = new Logout(8);
packets[4] = new GetMessage(1);
packets[8] = new AddFriend(0);
packets[11] = new JoinGroupChat(7); // etc... not going to finish.
}
public void handlePacket(IncomingData data)
{
int id = data.readByte() & 0xFF; //Secure value to 0-255.
if (packet[id] == null)
return; //Leave if packet is unhandled.
packets[id].execute(data);
}
Düzenleyin çünkü C ++ 'da bir Sıçrama Tablosu kullandığım için, şimdi bir fonksiyon işaretçisi atlama tablosu örneği göstereceğim. Bu çok genel bir örnek ama ben çalıştırdım ve düzgün çalışıyor. İşaretçiyi NULL olarak ayarlamanız gerektiğini unutmayın, C ++ bunu Java'daki gibi otomatik olarak yapmaz.
#include <iostream>
struct Packet
{
void(*execute)() = NULL;
};
Packet incoming_packet[255];
uint8_t test_value = 0;
void A()
{
std::cout << "I'm the 1st test.\n";
}
void B()
{
std::cout << "I'm the 2nd test.\n";
}
void Empty()
{
}
void Update()
{
if (incoming_packet[test_value].execute == NULL)
return;
incoming_packet[test_value].execute();
}
void InitializePackets()
{
incoming_packet[0].execute = A;
incoming_packet[2].execute = B;
incoming_packet[6].execute = A;
incoming_packet[9].execute = Empty;
}
int main()
{
InitializePackets();
for (int i = 0; i < 512; ++i)
{
Update();
++test_value;
}
system("pause");
return 0;
}
Ayrıca bahsetmek istediğim bir diğer nokta da ünlü Divide and Conquer. Dolayısıyla, 255'in üstündeki dizi fikrim, en kötü durum senaryosu olarak if ifadeleri 8'den fazla olmayacak şekilde azaltılabilir.
Yani, dağınık ve hızlı yönetmenin zor olduğunu ve diğer yaklaşımımın genellikle daha iyi olduğunu unutmayın, ancak bu, dizilerin kesmediği durumlarda kullanılır. Kullanım durumunuzu ve her durumun ne zaman en iyi şekilde çalıştığını belirlemelisiniz. Tıpkı birkaç kontrolünüz varsa bu yaklaşımlardan herhangi birini kullanmak istemeyeceğiniz gibi.
If (Value >= 128)
{
if (Value >= 192)
{
if (Value >= 224)
{
if (Value >= 240)
{
if (Value >= 248)
{
if (Value >= 252)
{
if (Value >= 254)
{
if (value == 255)
{
} else {
}
}
}
}
}
}
}
}