if-elseとif-elseにかなりの違いはありますか?
-
30-09-2019 - |
質問
次のコードスニペットを考えると、かなりの違いはありますか?
public boolean foo(int input) {
if(input > 10) {
doStuff();
return true;
}
if(input == 0) {
doOtherStuff();
return true;
}
return false;
}
vs。
public boolean foo(int input) {
if(input > 10) {
doStuff();
return true;
} else if(input == 0) {
doOtherStuff();
return true;
} else {
return false;
}
}
または、このコードを使用して、単一の出口原則がここでより良くなるでしょうか...
public boolean foo(int input) {
boolean toBeReturned = false;
if(input > 10) {
doStuff();
toBeReturned = true;
} else if(input == 0) {
doOtherStuff();
toBeReturned = true;
}
return toBeReturned;
}
知覚可能なパフォーマンスの違いはありますか?他のものよりも多かれ少なかれ保守可能/読み取り可能であると思いますか?
解決
2番目の例を使用すると、両方の条件が相互に排他的であると非常に明確に述べています。
最初のものでは、それはそれほど明確ではなく、(ありそうもない)イベントで、 input
両方のIFの間に追加されると、ロジックは変更されます。
将来の誰かが追加するとします input = 0
2番目のifの前。
もちろん、これは起こりそうにありませんが、ここで保守性について話している場合、if-elseは相互に排他的な条件があるとはっきりと言っていますが、多くのIFはそうではありません。 -ELSEブロック。
編集:この特定の例では、return句は相互排他性を強制しますが、繰り返しますが、保守性と読みやすさについて話しています。
とにかく、パフォーマンスについては、これがJavaでコード化されている場合、非常に遅いハードウェアにcを埋め込んでいた場合、おそらくJavaではありません。
他のヒント
あなたの意図を最もよく表しているフォームを使用してください。
物事がこれほど単純な場合は、単一の出口原則に従わないでください。それをより混乱させるだけです。
最初に:
最終的には、いくつかの奇妙な理由で誰かが、あなたが探していないとき、特定の奇妙な条件下でこの方法を失敗させるいくつかの追加ステートメントを追加します、または誰もが4時間を費やすでしょう。ソースコードを見て、アプリケーションをデバッグして最終的にそこにあることがわかりました。
2番目は間違いなく優れています。このシナリオを防ぐだけでなく、明確に述べるのにも役立ちます。 これ また この他 もういや。
すべてのコードがanで記述された場合
if
せいぜい10行の長さで、これは実際には問題ではありませんが、残念ながらそうではありません。他のプログラマーが存在します。私は3番目が好きではありません、それは私に戻り変数を探すことを強制し、それは簡単に見つけることができます
return
キーワード
速度のパフォーマンスについては、(ほぼ)同一です。それについて心配しないでください。
あなたの最後の例では、これをしないでください:
public boolean foo(int input) {
boolean toBeReturned = false;
if(input > 10) {
doStuff();
toBeReturned = true;
} else if(input == 0) {
doOtherStuff();
toBeReturned = true;
}
return toBeReturned;
}
しかし、これ(Javaの使用に注意してください 最後の):
public boolean foo(int input) {
final boolean toBeReturned; // no init here
if(input > 10) {
doStuff();
toBeReturned = true;
} else if(input == 0) {
doOtherStuff();
toBeReturned = true;
} else {
toBeReturned = false;
}
return toBeReturned;
}
そうすることで、あなたはあなたの意図を明確にします。これは「意図によるプログラミング」をサポートするIDEの神からのものです(潜在的なエラーを見るために「コンパイル」する必要はありません。時間と即座の警告を与えます)。
このようにあなたはそうです 承知しました 返品値を初期化することを忘れないでください。これは、後で別の条件が必要であると判断した場合に最適です。
Intellijのアイデア(バージョン4程度、ずっと前)を使用し始めて以来、私はいつもこれをしています。
一部の人々は、これはそのような単純なケースに対してはあまりにも多くのコードであると主張するでしょうが、それは完全にポイントを欠いています:ポイントは、コードを簡単に読みやすく、誤って割り当てを忘れることなく、後で簡単に拡張できるように意図を明確にすることです Tobereturned そして、あなたが追加するかもしれない後の条項から戻ることを誤って忘れることなく。
それ以外の場合、「簡潔さ」がゲームの名前である場合、私は次のように書きます。
public boolean foo(int a) {
return a > 10 ? doStuff() : a == 0 ? doOtherStuff() : false;
}
両方 dostuff と dootherstuff 真実を返すでしょう。
意味的に - いいえ。パフォーマンスの場合、これはコンパイラ、つまり、両方の条件が一度に真実ではないことを見つけることができるかどうかに依存します。私は標準的なサンコンパイラできることを賭けます。単一の出口原則を使用するかどうかは、味によって異なります。私は個人的に嫌いです。
バージョン#1と#2は#3よりも速い場合がありますが、パフォーマンスの違いは最小限だと思います。私はむしろ焦点を合わせたいです 読みやすさ.
個人的には、バージョン#2を使用することはありません。 #1と#3の間で、問題のケースで最も読みやすいコードを生成するコードを選択します。コードを分析するのが難しくなるため、メソッドでは多くの出口ポイントが好きではありません。ただし、いくつかの特別なケースのためにすぐに出口を出て、主要なケースを続行すると、流れがより明確になる場合があります。
2つの例が似ていない場合、このケースを考えてみてください。
public boolean foo(int input) {
if (input > 10) {
// doStuff();
return true;
}
System.out.println("do some other intermediary stuff");
if (input == 0) {
// doOtherStuff();
return true;
}
return false;
}
vs。
public boolean foo(int input) {
if (input > 10) {
// doStuff();
return true;
}
//System.out.println("doing some intermediary stuff... doesn't work");
else if (input == 0) {
// doOtherStuff();
return true;
} else {
return false;
}
return false;
}
最初のアプローチはおそらくでしょう より柔軟です, 、しかし両方 式 さまざまな状況で使用してください。
パフォーマンスに関しては、Sane Programmers :)によってコード化された定期的なJavaアプリケーションについては、違いを考慮に入れて違いを考慮して違いがあると思います。
あなたの場合、2番目の場合は、最初の場合は失敗した場合にのみ呼び出されます。 Else-Ifにありました。
言い換えれば、if-else-ifとif-ifが重要な場合、これはそれらの1つではありません。
例:これを試してから、Elseを削除した後に試してみてください。 2つの異なる出力が得られます。
int someNumber = 1;
if(someNumber < 5)
{
someNumber += 5;
Console.WriteLine("First call.");
}
else if(someNumber >= 5)
{
Console.WriteLine("Second call.");
}
最初のスニペットと2番目のスニペットの間には、実際には違いはありません。ただし、3番目のスニペットは非常に非効率的です。メソッドの最後のコード行までプログラムの制御を発信者に戻すのを待つため、処理能力/メモリを無駄にしますが、最初の2つのコードスニペットは、条件の1つが真であると判断するとすぐにコントロールを返します。