【问题标题】:Function structure: "if error, early return" or "if error, assign, else, assign, return assigned value"?函数结构:“如果出错,提前返回”还是“如果出错,赋值,否则,赋值,返回赋值”?
【发布时间】:2019-09-29 22:39:11
【问题描述】:

在嵌入式系统的上下文中,给定以下函数结构:

  1. 返回变量的条件赋值:

    int foo(int x)
    {
        int status;
    
        if (is_valid(x))
        {
            /* long computation with x */
            status = /* some result */;
        }
        else
            status = STATUS_ERROR;
    
        return status;
    }
    
  2. 早日归来:

    int foo(int x)
    {
        if (!is_valid(x))
            return STATUS_ERROR;
    
        /* long computation with x */
        return /* some result */;
    }
    

在我看来,后者应该比前者更受欢迎,因为:

  • 它不需要对status 进行额外和不必要的定义和赋值;
  • 它清楚地向读者说明,如果发生错误,除了返回STATUS_ERROR之外什么都不做,它写在函数的开头,以语言允许的最清晰的方式;
  • 它允许普通大小写的代码更扁平,因为它不必为 if-else 缩进。

但是,我已经看到前者被用于几个不同的项目。我认为造成这种情况的原因可能与开发的调试步骤有关,以允许:

  • 具有单点返回,可以更轻松地放置断点;
  • 通过status 检查即将返回的值(特别是在单次返回时)。

我是否认为这是为了调试而完成的?还有其他理由更喜欢 1. 而不是 2.? 1. 在裸机开发环境中被认为是良好实践吗?

请注意,与this question 不同,在x 无效的情况下返回错误代码之前不做任何工作。

【问题讨论】:

  • Linux 内核编码风格更喜欢第二个示例。但这是一个偏好问题,而不是你是否在调试。
  • 通常最好使用第二种方法,先测试一些东西并报告错误,然后可能测试其他东西并报告错误,最后执行主要操作,报告成功。当只有一个测试时,最好将较小的代码块(错误报告)放在第一位,因为它更容易识别程序的块。在第一种情况下,您将有关错误情况的信息隐藏在底部,距离触发条件的测试数英里。早期回报通常是有益的。

标签: c if-statement return


【解决方案1】:

如果您问是否应该使用其中一个,这将是一个基于意见的问题,应该被关闭。

但这个问题似乎是在问是否有任何事实让您在两者之间做出决定,或者这只是一个品味问题,所以对我来说这似乎是一个有效的问题。

答案很简短,两者之间没有客观区别;这很简单,你觉得哪个更舒服(或者你必须遵循一种编码风格)。

【讨论】:

    猜你喜欢
    • 2017-12-07
    • 2012-06-16
    • 2022-10-13
    • 1970-01-01
    • 2020-09-08
    • 1970-01-01
    • 2013-04-08
    • 2020-12-19
    • 2019-01-05
    相关资源
    最近更新 更多