web-dev-qa-db-ja.com

Java switchステートメント-returnを使用し、各ケースでブレークを省略することについて

この方法を考えると、これはいくつかのひどい文体的または意味的な偽物を表していますか?

private double translateSlider(int sliderVal) {
    switch (sliderVal) {
        case 0:
            return 1.0;
        case 1:
            return .9;
        case 2:
            return .8;
        case 3:
            return .7;
        case 4:
            return .6;
        default:
            return 1.0;
    }
}  

明らかにJavaチュートリアル ここ と一致していません。

しかし、それは明確で簡潔であり、これまでのところ私が必要とするものが正確に得られました。ローカル変数を作成し、各ケースに値を割り当て、各ケースにブレークを追加し、メソッドの最後に値を返す、説得力のある実用的な理由はありますか?

46
NickAbbey

ローカル変数に値を割り当て、それを最後に返すことは良い習慣と見なされます。 複数の出口はデバッグするのが難しい を持つメソッドは読みにくくなる可能性があります。

つまり、このパラダイムに残された唯一のプラスポイントです。それは、低レベルの手続き言語のみが存在していたときに生まれました。そして、それはその時にはるかに理にかなっています。

このトピックについては、 チェックアウト にする必要があります。その興味深い読み物。

58
rocketboy

人間の知能の観点からすると、コードは問題ありません。静的コード分析ツールのビューからは、複数のリターンがあるため、デバッグが難しくなります。たとえば、戻る前にただ1つのブレークポイントを設定することはできません。

さらに、プロのアプリで4つのスライダーステップをハードコードすることはありません。 max-minなどを使用して値を計算するか、配列で検索します。

public static final double[] SLIDER_VALS = {1.0, 0.9, 0.8, 0.7, 0.6};
public static final double SLIDER_DEFAULT = 1.0;


private double translateSlider(int sliderval) {
  double ret = SLIDER_DEFAULT;
  if(sliderval >= 0 && sliderval < SLIDER_VALS.length) {
      ret = SLIDER_VALS[sliderval];
  } 
  return ret;
}
6
AlexWien

あなたが書いたものは完全に素晴らしいと思います。また、複数のreturnステートメントがあることによる可読性の問題も見られません。

戻ることがわかっているときは、常にコード内のポイントから戻ることを選択します。これにより、リターンの下でロジックを実行することを回避できます。

デバッグとログ記録のための単一の戻り点を持っていることについての議論があるかもしれません。ただし、コードでは、使用してもデバッグとログの問題はありません。あなたが書いたように非常にシンプルで読みやすいです。

1
Kevin Bhuva

いいえ、あなたが持っているものは大丈夫です。また、これを式(sliderVal < 5 ? (1.0 - 0.1 * sliderVal) : 1.0)として実行するか、Map<Integer,Double>、しかしあなたが持っているものは大丈夫です。

0
yshavit

リテラルを使用しないことをお勧めします。

それ以外は、スタイル自体は見栄えが良いです。

0

スイッチを実行するだけで値を返すメソッドがある場合は、この方法が機能することを確認してください。ただし、メソッド内の他の要素との切り替えが必要な場合は、returnを使用できないか、メソッド内の残りのコードが実行されません。チュートリアルでは、コードの後に​​どのように印刷されているかに注意してください。あなたはこれを行うことができません。

0
DanielD

どうして

private double translateSlider(int sliderval) {
if(sliderval > 4 || sliderval < 0)
    return 1.0d;
return (1.0d - ((double)sliderval/10.0d));
}

または類似?

0
SubSevn

はい、これは良いです。チュートリアルは、必ずしもサイズが小さくてきれいではありません。それだけでなく、ローカル変数の作成はスペースの浪費であり、非効率的です。

0
Xperiaz X