У меня был вопрос. Мне нужно провести рефакторинг части моего кода, чтобы уменьшить сложность. У меня есть несколько похожих конструкций «если», которые повторяются после каждого случайного вызова API утилиты, на основе которого мне нужно откатить сделанную транзакцию или продолжить. Мне было просто интересно, поможет ли замена конструкции «если» уменьшить сложность. Я знаю, что макрос расширяется в коде, и поэтому я не уверен, поможет ли этот подход мне. Я довольно новичок в рефакторинге кодов. Если бы кто-то с идеей и знаниями о рефакторинге мог бы предложить мне какой-то способ, это было бы действительно полезно. Это похоже на замену кода ниже
retCode = certman_set_cmp_server_psk_refnum(ctx,(char*)domain.c_str(),NULL,NULL,0);
if (retCode != 0)
{
if(startedTxn == true)
{
status = ldapInterface.rollback_transaction();
if(0 != status)
{
clifwk_trace(session, "Rollback failed in internal transaction", CLIFWK_DEBUG);
syslog(LOG_ERR, "Rollback failed in internal transaction");
return CERTMAN_COMMIT_TRANSACTION_FAILED;
}
DEL_IF_NOT_NULL (ctx);
}
return retCode;
}
с retCode = certman_set_cmp_server_ip_port(ctx,(char*)domain.c_str(),NULL,0);
CHECK_ROLLBACK_TRANSACTION(session,ctx,ldapInterface,retCode,startedTxn);
RETURN_IF_ERROR(retCode);
Будет ли этот подход работать для меня, чтобы уменьшить сложность?
Ваша сложность, похоже, вызвана слишком большим C, слишком маленьким C ++. Добавление Больше С в виде макросов только усугубляет ситуацию.
Например, DEL_IF_NOT_NULL (ctx);
не один, а два три флаги. Я предполагаю, что это if (ctx) delete ctx
построить. Первый красный флаг if
заявление, которое ничего не делает. Второй красный флаг: вы используете необработанные указатели, а не полагаетесь на умные указатели. Это также исправило бы третий красный флаг, и это не удалось очистить в 0!=status
случай ошибки.
Подобная сложность обусловлена использованием retcode
вместо исключений.
Вот как просто должен быть код:
std::unique_ptr<T> ctx = foo();
auto transaction = ldapInterface.get_transaction(); // will rollback unless committed
certman::set_cmp_server_psk_refnum(*ctx,domain,nullptr,nullptr,0);
transaction.commit();