通常、ある条件または別の条件が true かどうかを確認したい場合は、次のようにコードを記述します。
if (i == 5 || j == 3) { // Do whatever here. }
OR 演算子を使用してさまざまな条件をチェックするコーディング スタイルのトラップを回避するためのきちんとした/パフォーマンスの良い方法はありますか?
通常、ある条件または別の条件が true かどうかを確認したい場合は、次のようにコードを記述します。
if (i == 5 || j == 3) { // Do whatever here. }
OR 演算子を使用してさまざまな条件をチェックするコーディング スタイルのトラップを回避するためのきちんとした/パフォーマンスの良い方法はありますか?
いいえ。どちらか一方のステートメントが真であるかどうかを調べたい場合は、OR 演算子を使用します。それはトラップではありません...それがロジックの仕組みです。
ただし、パフォーマンスについて心配する必要はまったくありません。2 回のチェックで問題が発生することはありません。また、短絡演算子をサポートする言語では、true と評価される最初の式の後にステートメントの実行が完了します。
||
「パフォーマンス」について言及しているので、それが短絡していることに気付いていない可能性があると思います。つまり、その一部が真になるとすぐに停止するため、必要以上に評価されることはありません.
詳細については、ドキュメントを参照してください。
コーディング スタイルが trapであるということは、if
ステートメントに追加するだけということですか (そして、私たちは皆それを見てきました) 。したがって、最終的には次のようになります。
if ( a == 2 || a == 3 || a == 5 || a == 14 ) // etc.
より多くの条件が追加されると、サポートされます。たとえば、それがメッセージ タイプまたは取引可能な商品であると想像してくださいa
。サポートされるメッセージ タイプまたは商品が増えるにつれて、コードはますます複雑になります。
さらに、このチェックは、オリジナルを必ずしも理解していないか、リファクタリングする時間が与えられていないプログラマーが、理解せずにこの条件を単純に複製しようとするため、いたるところで複製される可能性があります。
気が付くと、コードは (a) 読んで理解するのが非常に難しく (i == 5 || j == 3
実際にはどういう意味ですか?)、(b) コードに条件を追加しているため、テストがはるかに難しくなっています。
可能であれば、このロジックを文書化できる 1 つの場所に配置することをお勧めします。
inline bool isEngineStarted() { return i == 5 || j == 3; }
if ( isEngineStarted() ) // etc.,
それが私の最初の考慮事項です-理解しやすく、簡単に保守できる方法で機能するようにします。
パフォーマンスに関しては、比較対象として比較的狭い範囲にいくつかの異なる値がある場合、論理的にはルックアップに代替値の数に関係なく同じです(つまり、 O(N)ではなくO(1) )。
for ( int a = 0; a < 1000000000; ++a )
{
int c = a % 16;
if ( c == 2 || c == 3 || c == 5 || c == 14 ) b++;
}
次のようにすると、より速く動作することがわかります。
int b = 0;
bool sp[] = { false, false, true, true, false, true, false, false, false, false, false, false, false, false, true, false };
for ( int a = 0; a < 1000000000; ++a )
{
int c = a % 16;
if ( sp[ c ] ) b++;
}
これを試してみると、驚いたことに、最初のほうが速く動作しました。誰かが理由を提案できるかどうか知りたいです。
|| 演算子は OrElse であるため効率的です。つまり、最初の条件が true の場合、2 番目の条件は評価されず、最初の条件が false の場合にのみ評価されます。&& (AndAlso) 演算子は、最初の条件が true の場合にのみ 2 番目の条件が評価されるという点で同じです。
論理ORの使用を本当に避けたい場合、および単一の変数が複数の可能な値の1つであるかどうかを検出したい場合(例では行っていません-2つ持っています)、何かを行うことができますこのような:
class Program
{
static void Main(string[] args)
{
if (2.ContainedIn(1, 2, 3))
{
Console.WriteLine("found it!");
}
}
}
public static class ExtensionMethods
{
public static bool ContainedIn(this int val, params int[] vals)
{
return vals.Contains(val);
}
}
これについてどう思うかわかりません。あまり節約にはならないと思いますが、参考になれば幸いです。