单步退货声明或多步退货声明

时间:2013-02-05 18:49:57

标签: c++ coding-style

示例1:

int length()  
{  
        return strlen(random_string);  
}

示例2:

int length()  
{  
        int str_length = 0;  
        str_length = strlen(random_string);  
        return str_length;  
}  

问题:
我遇到过许多函数,其中一行代码可以满足该函数的必要条件,但我记得有一些关于避免这种捷径的事情。

在某些情况下,哪一个比另一个更合适,或者我应该总是选择更简单的代码。

6 个答案:

答案 0 :(得分:2)

我永远不会选择你的第二个例子,因为初始化然后分配只是无缘无故地占用空间。

可能做的事情如下:

int length()  
{  
    const int str_length = strlen(arbitrary_string);  
    return str_length;  
}

这有两个原因:

  1. 您允许编译器执行命名返回值优化;和
  2. 您的返回值现在凭借名称自我记录。
  3. 但是,对我来说,这更像是一个默认规则。

    在这个具体的实际案例中:

    1. 您的返回类型只是一个微不足道的int,因此无论如何都不允许使用命名的返回值优化,即使它是无意义的,也将是毫无意义的。和
    2. 这个功能已经很简单,而且名称也很合适。
    3. 所以我将使用第一个例子:

      int length()  
      {  
          return strlen(arbitrary_string);
      }
      

答案 1 :(得分:1)

我说总是以示例1为例。它读得更好。如果中间变量名称辅助可读性或者表达式应该拆分成多个语句,我只会将表达式放在return语句中。

我绝不会建议示例2,但初始化为0是没有意义的。中间地带更好:

int length()  
{  
    int str_length = strlen(random_string);  
    return str_length;  
}

但是,str_length显然不会告诉您任何功能名称strlen

答案 2 :(得分:1)

采用多步骤方法的一个原因是,如果您决定添加一行来打印长度值,那就不那么麻烦了:

int length()
{
    const int str_length = strlen(something);
    printf("str_length = %d\n", str_length);
    return str_length;
}

或者如果你想添加一些额外的断言:

int length()
{
    const int str_length = strlen(something);
    assert(str_length >= 0);
    return str_length;
}

除此之外,所有关于你认为最合适的事情[当然,除非你有严格的编码标准!]

答案 3 :(得分:0)

一般来说,代码应易于阅读并明确目的。在您的示例中,我更喜欢较短的版本。使用长版本没有关于语义的额外信息。

一如既往可能有例外。特别是当返回的值来自长而复杂的表达式时。然后命名一些中间结果可能会有所帮助。

答案 4 :(得分:0)

要回答这个问题总是选择更容易阅读的解决方案,这在每种编程语言中都很重要,但在C ++中它非常重要。

对于您的特定问题,C ++开发人员最容易阅读的是选项编号1,它简洁明了。但如果碰巧你必须写的单行是:

return (classA *)(function1(data1)->function2())->function3();

在这种情况下,总是选择分割线,因为即使你明白它现在做了什么,你也很难弄清楚将来会发生什么。

希望有所帮助

答案 5 :(得分:-1)

在大多数情况下,可读性总是胜过性能。如果您有性能关键代码,那就去追求性能。但是,这是一个例外,而不是规则。

始终追求可读性。