2017-01-02 160 views
1

当我们创建一个返回布尔值的函数时,我们是否应该返回每个if/else语句?我们应该使用`else return`还是`return`?

例如,如果你想检查一个文件中迅速存在,你会做

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 statment添加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 
    } 
} 

对我来说,第一个例子看上去干净,但我不知道这是很好的做法。尽管它看起来更干净,但我想用最好/最安全的方式,所以这个问题并不是对看起来最好的看法。

+3

此问题语言特定?如果是这样,请添加合适的语言标签。 – Quentin

+1

@Quentin这不是语言特定的。我想知道其他语言,因为我也使用java。给出的例子只是因为我当时正在研究这个项目。 – iProgram

+0

请看这里http://refactoring.com/catalog/replaceNestedConditionalWithGuardClauses.html –

回答

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

我已经为你更新了语法。 – iProgram

+0

@iProgram哇,这对我来说看起来有点疯狂。谢谢:) – Quentin

+0

同样通过这样做,它可以让我做Robert C. Martin在他的Clean Code书中所说的。函数应该只有一个缩进级别,最多两个。这允许我将大部分代码保留在一个缩进级别。 – iProgram

-2

虽然两者在这里都可以正常工作,但是您应该使用其他方式返回更好的做法。它比第一个更安全,它会增加你未来的代码也

+3

它更安全吗? – melpomene

+4

你是什么意思“它会增加你未来的范围”? – melpomene

0

两个例子都将返回“真”仅当条件

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

满足的范围。

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