【发布时间】:2020-10-03 06:26:25
【问题描述】:
我正在编写一个 NMEAParser 库。顾名思义,它解析NMEA sentences。没什么疯狂的。
它的入口点是一个函数,它接受 NMEA 字符串作为其唯一参数,并查看其开头以将其传递给正确的解码器。这是函数:
bool NMEAParser::dispatch(const char *str) {
if (!str[0]) {
return false;
}
//check NMEA string type
if (str[0] == '$') {
//PLSR245X
if (str[1] == 'P' && str[2] == 'L' && str[3] == 'S' && str[4] == 'R' && str[5] == ',' && str[6] == '2' && str[7] == '4' && str[8] == '5' && str[9] == ',') {
if (str[10] == '1')
return parsePLSR2451(str);
if (str[10] == '2')
return parsePLSR2452(str);
if (str[10] == '7')
return parsePLSR2457(str);
} else if (str[1] == 'G' && str[2] == 'P') {
//GPGGA
if (str[3] == 'G' && str[4] == 'G' && str[5] == 'A')
return parseGPGGA(str);
//GPGSA
else if (str[3] == 'G' && str[4] == 'S' && str[5] == 'A')
return parseGPGSA(str);
//GPGSV
else if (str[3] == 'G' && str[4] == 'S' && str[5] == 'V')
return parseGPGSV(str);
//GPRMC
else if (str[3] == 'R' && str[4] == 'M' && str[5] == 'C')
return parseGPRMC(str);
//GPVTG
else if (str[3] == 'V' && str[4] == 'T' && str[5] == 'G')
return parseGPVTG(str);
//GPTXT
else if (str[3] == 'T' && str[4] == 'X' && str[5] == 'T')
return parseGPTXT(str);
//GPGLL
else if (str[3] == 'G' && str[4] == 'L' && str[5] == 'L')
return parseGPGLL(str);
}
//HCHDG
else if (str[1] == 'H' && str[2] == 'C' && str[3] == 'H' && str[4] == 'D' && str[5] == 'G')
return parseHCHDG(str);
}
return false;
}
我的问题是这个函数的圈复杂度很高,我的 SonarQube 抱怨它:
这不是一个真正的问题,因为代码很容易阅读。但我想知道如何在降低其复杂性的同时保持其易于阅读和高效。
【问题讨论】:
-
使用
memcmp或strncmp代替一堆字符比较可能会有所帮助。 -
我认为,正如@rodrigo 所建议的那样,可能是所有字符比较推动了这一指标。作为
memcmp或strncmp的替代方案,您可以使用string类。