ดังนั้นหากคุณวางแผนที่จะมีหน่วยความจำแพ็คเก็ตจำนวนมากในทุกวันนี้ก็ไม่ได้มีค่าใช้จ่ายมากนักและอาร์เรย์ก็ค่อนข้างเร็ว นอกจากนี้คุณยังไม่สามารถพึ่งพาคำสั่งสวิตช์เพื่อสร้างตารางกระโดดโดยอัตโนมัติและด้วยเหตุนี้การสร้างสถานการณ์ตารางกระโดดด้วยตัวคุณเองจึงง่ายกว่า ดังที่คุณเห็นในตัวอย่างด้านล่างเราถือว่าสูงสุด 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);
}
แก้ไขเนื่องจากฉันใช้ Jump Table ใน 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 {
}
}
}
}
}
}
}
}