0

我有一个问题。我需要重构部分代码以降低复杂性。我有多个类似的“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);

这种方法对我有用以降低复杂性吗?

4

1 回答 1

3

您的复杂性问题似乎是由太多 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();
于 2015-05-08T10:05:09.817 回答