Исходный код
while (!bFound && j < enmMessages)
{
if (!strcmp(str.operatorconstchar * (), strPacketName[j]))
{
iPacketType = j;
bFound = true;
TRACE(" of type %s\n",strPacketName[j]);
strcat(strOut," of type ");
strcat(strOut, strPacketName[j]);
break;
}
j++;
}
Какой рефакторинг применить к исходному коду
- В этом цикле смешаны две ответственности: найти подходящий элемент и предпринять соответствующие действия при успешном поиске. Рекомендую рефакторинг «извлечение метода», извлечённый метод будет искать пакет с именем
str
. - Для обхода списка пакетов применён цикл
while
, тогда как по смыслу больше подходит for
. - Стоит избавиться от избыточной переменной
bFound
. - Для получения указателя на массив символов, из которых состоит строка
str
, применена громоздкая малопонятная конструкция .operator const char * ()
, в то время как более ясный способ получить указатель — применить вызов метода c_str()
. - Для сравнения строк применяется сишная функция
strcmp()
, хотя для сравнения с массивом символов можно использоать штатный метод compare()
самой строки. - Названия переменных не согласованы между собой: массив пакетов назван
strPacketName
— ожидается, что в нём названия пакетов, а номер найденного пакета — iPacketType
, тип пакета. - В идеале массив пакетов должен быть оформлен в виде самостоятельного класса, чтобы отделить код по его обслуживанию от кода, который получает выгоду.
Вариант рефакторинга исходного кода
int findPacket(const string& packetName) {
for (int i = 0; i < enmMessages; i++) {
if (!packetName.compare(strPacketName[i])) {
return i;
}
}
return -1;
}
foundPacket = findPacket(str);
if (foundPacket >= 0) {
TRACE(" of type %s\n",strPacketName[foundPacket]);
strcat(strOut," of type ");
strcat(strOut, strPacketName[foundPacket]);
}
Теория