3

重複の可能性:
関数の終了点が 1 つだけである必要があるのはなぜですか?

returnメソッドには、理想的には 1 つの (それ以上の)ステートメントが必要であると聞きました。それは本当です?

たとえば、どのような方法がよいでしょうか。

//1
public Object getResult() {
   Object result; 

   if (someValue != null) {  **// NOT null checking**

       // initializing result
   }
   return result;
}


// 2
public Object getResult() {
   Object result; 

   if (someValue == null) {  // **null checking**
       return null;
   }
   // initializing result
   return result;
}
4

8 に答える 8

2

構造的プログラミングのガイドラインの 1 つは、関数 (メソッド) で複数の出口点を使用しないことです。その理由は主に読みやすさです (複数の出口点を持つアルゴリズムを描画してみてください。見栄えがよくありません)。しかし、今日ではコードを書く前にアルゴリズムを描く人はほとんどおらず、最近の IDE は到達不能なコードなどを検出できます。複数の出口点メソッドを使用すると、柔軟性が向上するため、コードの前に戻るメソッドを作成できます。このメソッドが続行すると、何らかの副作用が生じる可能性があります。実行で。また、これはほとんどの場合、複雑な条件テストの使用を防止するため、より最適化 (つまり高速化) できます。もちろん、コンパイラがコードをどのように変更するかは難しい問題ですが、ほとんどのコンパイラは単一の終了メソッドから複数の終了メソッドを作成していると思います。

于 2012-11-09T09:49:20.603 に答える
1

理想的にはいくつのreturnステートメントが関数を持っている必要がありますか?

読みやすさを犠牲にしてではなく、1つだけ言います。

複数のonreturnステートメントを使用するとコードの可読性が向上する場合は、関数から複数の出口点を選択する必要があります。

最後に、それは個人の選択とプロジェクトのコーディングガイドラインに依存します。

提供した2つのバージョンのコードから選択する場合は、2番目のバージョンを選択します。私にとってはもっと読みやすいです。

于 2012-11-09T09:45:04.813 に答える
1

Eclipseでcheckstyleを使用している場合、それは間違いなく1つです。ただし、コードの記述が難しくなる場合があります(たとえば、基本ケースをテストしている再帰メソッドの場合)return。そのような場合にステートメントを1つしか持てない場合は、コンテキストで最適なものを使用する必要があると思います。

したがって、コンテキストによって異なります

于 2012-11-09T09:42:29.970 に答える
1

複数の return ステートメントを使用できることは間違いありません。「return ステートメントは 1 つだけ」というルールがある場合、次のようになる可能性があります。

if (value != null) {
  if (value.fieldA != null) {
     if (value.fieldB != null) {
        // initialize
     }
 } 
 return result;

これの代わりに:

if (value == null) {
   return null;    
}
if (value.fieldA == null) {
   return null;
}
if (value.fieldB == null) {
   return null;
}
// initialize
return result;

2 番目の方がはるかに読みやすく、デバッグしやすく、場合によってはおそらくより効率的です。

于 2012-11-09T09:47:39.353 に答える
0

これはおそらく誰もが自分の意見を持っている問題です。しかし、明確な正解や不正解はないと思います。私は通常、returnステートメントの数を気にしません。なんらかの方法でとどまる理由がない場合、私はそれから戻ります。

于 2012-11-09T09:47:24.250 に答える
0

>どちらも正しいです。プロジェクトのシナリオによって異なります。

例:

あなたのコードの2番目のケースでは、これより下に多数の行コードがある場合

**if (someValue == null) 
  {  
    // **null checking**
   return null;
  }**

次に、「 if」ステートメントから戻る

最初の例(コード)のようにコードが非常に少ない場合は、各if条件に戻り値を設定し、@endで返します。

>これも参照してください

于 2012-11-09T09:42:10.950 に答える
0

2 番目の例では、null が返され、次のルールが読み取られます。関数が受け入れる値をチェックするときに return ステートメントを追加します。値が悪い場合はすべての関数を処理したくないため、null を返すか、例外をスローします。

于 2012-11-09T09:40:53.237 に答える