Так что, если вы планируете иметь много пакетов, память в наши дни не является большой затратой, а массивы работают довольно быстро. Вы также не можете полагаться на оператор switch для автоматического создания таблицы переходов, и поэтому проще создать сценарий таблицы переходов самостоятельно. Как вы можете видеть в приведенном ниже примере, мы предполагаем максимум 255 пакетов.
Чтобы получить приведенный ниже результат, вам нужна абстракция. Я не собираюсь объяснять, как это работает, поэтому, надеюсь, вы это понимаете.
Я обновил это, чтобы установить размер пакета на 255, если вам нужно больше, чем вам нужно будет выполнить проверку границ для (id <0) || (id> длина).
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;
}
Еще один момент, который я хотел бы затронуть, - это знаменитый «Разделяй и властвуй». Таким образом, моя идея с массивом выше 255 может быть уменьшена до 8 операторов if как наихудший сценарий.
То есть, но имейте в виду, что это становится беспорядочным и трудно управляемым быстро, и мой другой подход, как правило, лучше, но он используется в тех случаях, когда массивы просто не справляются. Вы должны выяснить свой вариант использования и когда каждая ситуация работает лучше всего. Точно так же, как вы не захотите использовать любой из этих подходов, если у вас есть всего несколько проверок.
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 {
}
}
}
}
}
}
}
}