Więc jeśli planujesz mieć dużo pamięci pakietów, obecnie nie jest to duży koszt, a tablice są dość szybkie. Nie można również polegać na instrukcji switch, która automatycznie generuje tabelę skoków i jako taka łatwiej jest samodzielnie wygenerować scenariusz tabeli skoków. Jak widać w poniższym przykładzie, zakładamy maksymalnie 255 pakietów.
Aby uzyskać poniższy wynik, potrzebujesz abstrakcji ... Nie będę wyjaśniał, jak to działa, więc mam nadzieję, że masz to rozumieć.
Zaktualizowałem to, aby ustawić rozmiar pakietu na 255, jeśli potrzebujesz więcej, to będziesz musiał sprawdzić granice (id <0) || (id> długość).
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);
}
Edytuj, ponieważ często używam tabeli skoków w C ++, teraz pokażę przykład tabeli skoków wskaźnika funkcji. To jest bardzo ogólny przykład, ale uruchomiłem go i działa poprawnie. Pamiętaj, że musisz ustawić wskaźnik na NULL, C ++ nie zrobi tego automatycznie, jak w Javie.
#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;
}
Kolejną kwestią, którą chciałbym poruszyć, jest słynny Divide and Conquer. Więc mój pomysł na tablicę powyżej 255 można zredukować do nie więcej niż 8 instrukcji if jako najgorszy scenariusz.
To znaczy, pamiętaj, że jest to bałaganiarskie i trudne do szybkiego zarządzania, a moje inne podejście jest ogólnie lepsze, ale jest to wykorzystywane w przypadkach, gdy tablice po prostu tego nie radzą. Musisz określić swój przypadek użycia i kiedy każda sytuacja działa najlepiej. Tak jak nie chciałbyś używać żadnego z tych podejść, jeśli masz tylko kilka sprawdzeń.
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 {
}
}
}
}
}
}
}
}