2017-01-02 50 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」。

相關問題