Отже, якщо ви плануєте мати навантаження пакетів пам'яті насправді не велика вартість в ці дні, і масиви досить швидкі. Ви також не можете розраховувати на оператор перемикання, щоб автоматично генерувати таблицю стрибків, і таким чином простіше створити сценарій таблиці стрибків самостійно. Як ви бачите в наведеному нижче прикладі, ми припускаємо максимум 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 (Value >= 128)
{
if (Value >= 192)
{
if (Value >= 224)
{
if (Value >= 240)
{
if (Value >= 248)
{
if (Value >= 252)
{
if (Value >= 254)
{
if (value == 255)
{
} else {
}
}
}
}
}
}
}
}