Так что, если вы планируете загружать пакеты, память в наши дни не такая уж и большая, а массивы довольно быстрые.Вы также не можете полагаться на оператор switch для автоматической генерации таблицы переходов, поэтому проще создать сценарий таблицы переходов самостоятельно.Как видно из приведенного ниже примера, мы принимаем максимум 255 пакетов.
Чтобы получить приведенный ниже результат, вам нужна абстракция. Я не собираюсь объяснять, как это работает, надеюсь, вы понимаете это.
Я обновил это, чтобы установить размер пакета равным255 если вам нужно больше, вам нужно будет выполнить проверку границ для (id <0) ||(id> length).
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);
}
Правка, поскольку я часто использую таблицу переходов в C ++, сейчас я покажу пример таблицы переходов указателя функции.Это очень общий пример, но я запустил его, и он работает правильно.Помните, что вы должны установить указатель на NULL, C ++ не будет делать это автоматически, как в Java.
#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;
}
Также еще один момент, который я хотел бы затронуть, это знаменитый Divide and Conquer.Таким образом, моя вышеупомянутая идея массива 255 может быть уменьшена до не более 8, если операторы являются худшим сценарием.
Т.е., но имейте в виду, что это становится беспорядочным и трудно управляемым, а мой другой подход обычно лучше, ноэто используется в тех случаях, когда массивы просто не обрезают его.Вы должны выяснить свой вариант использования и когда каждая ситуация работает лучше всего.Точно так же, как вы не захотите использовать ни один из этих подходов, если у вас есть только несколько проверок.
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 {
}
}
}
}
}
}
}
}