我们应该使用`else return`还是`return`?

时间:2017-01-02 13:08:27

标签: if-statement language-agnostic return

当我们创建一个返回布尔值的函数时,我们是否应该返回每个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,或者我们应该在每个return false语句中添加if(如下所示) )

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
    }
}

对我来说,第一个例子看起来更干净,但我不确定这是一个好习惯。虽然它看起来更干净,但我想用最好/最安全的方式,所以这个问题并不是对什么看起来最好的看法。

3 个答案:

答案 0 :(得分:2)

这个问题几乎看起来像纯粹的基于意见的问题。但我知道一般功能模式,包括你的问题的答案。

一个功能应该:

  • 验证其参数;
  • 然后完成任务,负责处理错误并在无法成功的情况下纾困;
  • 然后计算并返回其结果。

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

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)
}

答案 1 :(得分:0)

两个例子都会返回" true"只有条件

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

满足。

由于这是返回" true"的唯一方法,因此为了简单和可读性,我将使用第一个示例。 " else" -blocks是不必要的,因为你的函数将不可避免地返回" false"如果不符合上述条件。

答案 2 :(得分:-3)

虽然两者在这里都可以正常工作,但你应该使用其他方式返回以获得更好的练习它比第一个更安全,它也将增加你未来的代码范围