我有一个问题。我需要重构我的一部分代码以降低复杂性。我有多个类似的“if”结构,它们在每次随机实用程序 API 调用后重复,我需要根据这些结构回滚已完成的事务,否则继续。我只是想知道替换“if”结构是否会帮助我降低复杂性。我知道宏在代码中扩展,这就是为什么我不确定这种方法是否对我有帮助。我在重构代码方面相当陌生。如果对重构有想法和知识的人可以给我一些建议,那将非常有帮助。这就像替换下面的代码
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++ 引起的。以宏的形式添加更多 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();
关于c++ - 用宏替换重复的 "if" block 是否会降低 C++ 中的代码复杂性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30119962/