2017-01-02 19 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を追加する必要があり、あります上記、または私たちが私に

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

(下図参照)、各ifなステートメントに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

@iプログラムワウ、それは私に少し狂っているようです。ありがとう:) – Quentin

+0

また、このようにして、私はロバートC.マーティンが彼のクリーンコードブックで言うことをすることができます。関数はインデントレベルを1つ、最大値を2つだけ持つ必要があります。これにより、ほとんどのコードを1つのインデントレベルに保つことができます。 – iProgram

-2

両方ともここで問題なく動作しますが、より良い練習のためには、他のものを使用する必要があります。その複数の第一のものより安全な、それは両方の例は、条件

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

が満たされた場合にのみ「true」を返すも

+3

どのように安全ですか? – melpomene

+4

「将来の範囲が広がる」とはどういう意味ですか? – melpomene

0

コードのあなたの将来の範囲を増加します。

これが「真」を返す唯一の方法であるため、わかりやすくするために、最初の例を取り上げます。 上記の条件が満たされない場合、関数は必然的に "false"を返すため、 "else"ブロックは不要です。

関連する問題