多种if方法的构造约定

时间:2015-11-30 08:39:51

标签: c++

如果有一些构造方法用于构造具有多个if的构造方法,我会更加干净。在解雇方法之前的大部分时间你必须检查输入参数和其他东西,例如。不是nullptr,是> 0,是!= -1等。有时你不能在一个中检查这个,结果你有这样的东西:

if(arg != nullptr)
{
    if()
    {
        if()
        {
            if()
            {
                /*actual code here*/
            }
            else
            {

            }
        }
        else
        {

        }
    }
    else
    {
        /* other error message like "License check error: wrong key!" */
    }
}
else
{
    /* wrong input args! */
}

好的惯例是你的行少于80个字符,这为我们提供了更少的实际代码空间。代码变得越来越难以理解。

4 个答案:

答案 0 :(得分:3)

您可以在问题出现时尽早返回,或者抛出异常:

if(arg == nullptr) {
    log("arg was null, not doing anything");
    return;
}

//if the user forgot to make the toast, we can do it for them
if(forgotToMakeToast) {
    makeToast();
}

if(ranOverDog) {
    //we can't continue if the user ran over our dog, throw an exception
    throw too_angry_exception;
}

//actual code

通过将错误处理与地点错误检查联系起来,这使您的代码结构更加明显。

答案 1 :(得分:1)

我通常做的是这样的事情:

if(arg == nullptr)
{
    /* wrong input args! */
    return;
}


if()
{
    /* other error message like "License check error: wrong key!" */
    return;
}

...


/*actual code here*/

然后你将所有错误“ifs”和错误处理放在一个地方,最后的实际功能代码很好地分开。

答案 2 :(得分:0)

如果函数中的ifwhilefor的子级别太多,则表明该函数应拆分为2个或更多单独的函数。根据具体的代码,它可能看起来像这样:

public void MyClass::Run(arg)
{
    if(arg != nullptr)
    {
        if()
        {
            RunActualCode()
        }
        else
        {
            /* other error message like "License check error: wrong key!" */
        }
    }
    else
    {
        /* wrong input args! */
    }
}

private void MyClass::RunActualCode(...)
{
    if()
    {
        if()
        {
            /*actual code here*/
        }
        else
        {

        }
    }
    else
    {

    }
}

有很多关于此的建议,例如:

  

Rec 4.7没有太复杂的功能。

     

每个人都不得不接管其他人编写的代码   知道复杂的代码很难维护。有很多方法   函数可能很复杂,例如代码行数,   参数的数量,或通过a的可能路径的数量   功能。通过函数的可能路径数,即   使用许多控制流原语的结果是主要的   为什么功能复杂的原因。所以你应该知道   大量使用控制流原语将使您的代码成为事实   更难维护。   http://www.tiobe.com/content/paperinfo/CodingStandards/hem/industrial/bookindex.htm

Limiting complexity during development

答案 3 :(得分:0)

您的原始构造可以这样写:

do
{
    if(nullptr == arg) // Note: *negate* your original conditions!
    {
        /* wrong input args! */
        break;
    }
    if(...)
    {
        /* other error message like "License check error: wrong key!" */
        break;
    }
    if(...)
    {
        ...
        break;
    }
    if(...)
    {
        ...
        break;
    }

    /*actual code here*/

} while (0);
  • 优点:

    1. 没有嵌套if s;
    2. 使用break代替goto跳出整个区块;
    3. 逻辑更清晰,更易于维护:如果你想添加一个检查守卫,只需追加一个if(...){...; break;};
  • 缺点:

    1. do-while(0)看起来有点奇怪;
    2. 你应该否定所有原始条件,例如: if(cond) => if(!cond),可能会影响代码清晰度;