【问题标题】:Should we use `else return` or `return`?我们应该使用`else return`还是`return`?
【发布时间】:2017-05-16 14:21:40
【问题描述】:

当我们创建一个返回布尔值的函数时,我们是否应该在每个 if/else 语句上都返回?

例如,如果你想在 swift 中检查一个文件是否存在,你会这样做

func fileExists() -> Bool
{
    if let dir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first
    {
        let path = dir.appendingPathComponent("\(self.name).\(self.type)")
        if(FileManager.default.fileExists(atPath: path.path))
        {
            return true
        }
    }
    return false
}

问题是,如果满足上述条件,我们应该在函数末尾添加return false,还是应该在每个if 语句上添加return false(如下所示)

func fileExists() -> Bool
{
    if let dir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first
    {
        let path = dir.appendingPathComponent("\(self.name).\(self.type)")
        if(FileManager.default.fileExists(atPath: path.path))
        {
            return true
        } else {
            return false
        }
    } else {
        return false
    }
}

对我来说,第一个示例看起来更干净,但是我不确定这是不是一个好习惯。尽管它看起来更干净,但我想改用最好/最安全的方式,所以这个问题不是关于什么看起来最好的意见。

【问题讨论】:

  • 这个问题是特定语言的吗?如果是,请添加合适的语言标签。
  • @Quentin 这不是特定于语言的。我也想知道其他语言,因为我也在使用 java。给出的示例只是因为我当时正在从事该项目。
  • 在这种特定情况下,if (X) { return true } else { return false } 可以只替换为return X
  • 这是基于意见的。我的观点是我会严重嘲笑第二种风格的代码。使用if 然后返回truefalse 让我的脊椎颤抖,胆汁涌上我的食道。

标签: if-statement language-agnostic return


【解决方案1】:

这个问题几乎看起来像是一个纯粹的基于意见的问题。但我确实知道包含您问题的答案的一般功能模式。

函数应该:

  • 验证其参数;
  • 然后做它的任务,负责错误处理,如果不能成功则退出;
  • 然后计算并返回结果。

结果是一个非常线性的控制流,没有必要的嵌套。将此准则应用于您的代码:

func fileExists() -> Bool
{
    //If path exists, the variable dir will have a value. If not, bail out
    guard let dir = FileManager.default.urls(
        for: .documentDirectory,
        in: .userDomainMask
    ).first else {
        return false
    }

    let path = dir.appendingPathComponent("\(self.name).\(self.type)")

    // if(...) { return true; } else { return false; } pattern factored out
    return FileManager.default.fileExists(atPath: path.path)
}

【讨论】:

  • 另外,通过这样做,它允许我执行 Robert C. Martin 在他的 Clean Code 书中所说的内容。函数应该只有一个缩进级别,最多两个。这使我可以将大部分代码保持在一个缩进级别。
【解决方案2】:

仅当条件满足时,两个示例才会返回“true”

if(FileManager.default.fileExists(atPath: path.path))

满足了。

由于这是返回“true”的唯一方法,为了简单和可读性,我将使用第一个示例。 “else”块是不必要的,因为如果不满足上述条件,您的函数将不可避免地返回“false”。

【讨论】:

    【解决方案3】:

    虽然两者在这里都可以正常工作,但你应该使用 else return 以获得更好的练习。它比第一个更安全,它还会增加你未来的代码范围

    【讨论】:

    • 如何更安全?
    • “它将扩大您未来的范围”是什么意思?
    猜你喜欢
    • 2012-02-29
    • 2015-10-20
    • 2010-11-01
    • 2011-10-20
    • 2016-04-12
    • 2017-02-05
    • 1970-01-01
    • 2010-12-21
    相关资源
    最近更新 更多