长开关语句¶
ID: cpp/long-switch
Kind: problem
Security severity:
Severity: recommendation
Precision: high
Tags:
- maintainability
- readability
Query suites:
- cpp-security-and-quality.qls
此规则查找开关语句,其 case 语句包含过多的代码。长 case 语句通常会导致大量嵌套,这使得理解代码的实际功能变得更加困难。请考虑将每个 case 语句的代码封装在函数中,并在每个 case 语句中仅使用 switch 语句调用相应的函数。
指示的 switch 语句的 case 语句长度超过 30 行。
建议¶
考虑为长 case 语句中的代码创建单独的函数。
示例¶
//This switch statement has long case statements, and can become difficult to
//read as the processing for each message type becomes more complex
switch (message_type) {
case CONNECT:
_state = CONNECTING;
int message_id = message_get_id(message);
int source = connect_get_source(message);
//More code here...
send(connect_response);
break;
case DISCONNECT:
_state = DISCONNECTING;
int message_id = message_get_id(message);
int source = disconnect_get_source(message);
//More code here...
send(disconnect_response);
break;
default:
log("Invalid message, id : %d", message_get_id(message));
}
//This is better, as each case is split out to a separate function
switch (packet_type) {
case STREAM:
process_stream_packet(packet);
break;
case DATAGRAM:
process_datagram_packet(packet);
break;
default:
log("Invalid packet type: %d", packet_type);
}