Wenn Sie also vorhaben, viel Paketspeicher zu haben, sind die Kosten heutzutage nicht wirklich hoch und die Arrays sind ziemlich schnell. Sie können sich auch nicht auf eine switch-Anweisung verlassen, um automatisch eine Sprungtabelle zu generieren. Daher ist es einfacher, das Sprungtabellenszenario selbst zu generieren. Wie Sie im folgenden Beispiel sehen können, gehen wir von maximal 255 Paketen aus.
Um das folgende Ergebnis zu erhalten, brauchen Sie eine Abstraktion. Ich werde nicht erklären, wie das funktioniert. Hoffentlich haben Sie ein Verständnis dafür.
Ich habe dies aktualisiert, um die Paketgröße auf 255 festzulegen, wenn Sie mehr benötigen, als Sie für (id <0) || prüfen müssen (id> Länge).
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);
}
Bearbeiten, da ich in C ++ häufig eine Sprungtabelle verwende, zeige ich jetzt ein Beispiel für eine Sprungtabelle für Funktionszeiger. Dies ist ein sehr allgemeines Beispiel, aber ich habe es ausgeführt und es funktioniert korrekt. Beachten Sie, dass Sie den Zeiger auf NULL setzen müssen. C ++ führt dies nicht automatisch wie in Java aus.
#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;
}
Ein weiterer Punkt, den ich ansprechen möchte, ist das berühmte Teilen und Erobern. Meine über 255 Array-Idee könnte also auf nicht mehr als 8 if-Anweisungen als Worst-Case-Szenario reduziert werden.
Dh aber denken Sie daran, es wird chaotisch und schwer, schnell zu verwalten, und mein anderer Ansatz ist im Allgemeinen besser, aber dies wird in Fällen verwendet, in denen Arrays es einfach nicht schneiden. Sie müssen Ihren Anwendungsfall herausfinden und wann jede Situation am besten funktioniert. Genauso wie Sie keinen dieser Ansätze verwenden möchten, wenn Sie nur wenige Überprüfungen haben.
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 {
}
}
}
}
}
}
}
}