私はあなたの戦いを選ぶことについて@MartinMaatに同意します。
これらの多くのルールで言語が修正されているにもかかわらず、言語が実際に理解されていないため、「念のため」の多くの場合があります。優先順位のルールが理解されていないために必要としない式を括弧でくくって言語。しかし、それでも、そのような習慣はほとんど無害です。
私は若い頃、言語の詳細を学び、そのような余分なコードを書かないようにすべきだと感じました。(私の不機嫌なことの1つにはreturn (0);
不要な括弧がありました。)しかし、特にクライアントからサーバーにジャンプするなど、非常に多くの異なる言語を使用しているので、今はその立場をモデレートしています...そのような問題のたるみ。
あなたは、サイクロマティックが論理的に推論された議論に取り掛かり始めることについてポイントです。コードカバレッジ、特により高いレベルのカバレッジを見てみましょう:
- それぞれの決定はすべての可能な結果をとります
新しい操作で強制的にNULLを返すことはできないため、この条件付き操作でコードカバレッジのレベルを上げる方法はありません。 もちろん、これは組織にとって重要な場合とそうでない場合があります。
ただし、このコードカバレッジの問題のため、括弧の過剰よりも優先します。
一方、コード生成、JIT、およびオプティマイザはすべて、new
ed値がnullになることはないことを理解しているため、基になる生成コードはおそらく1ビットも影響を受けません。したがって、実際のコストは、可読性とソースコードカバレッジ機能の点でのみ発生します。
そのようなifステートメントの「else-part」はどのように見えるのですか?
他の部分がない場合、ルーチンの終わりから落ちるか、または他のコードに落ちる(つまりelse
、これにif
は当てはまらない)は潜在的に危険であると私は主張するでしょう。または、その行の下のコードでNULLも処理します。
それが読んだ場合:
p = new Object ();
if ( p != null ) {
p.field = value;
}
else {
throw new NullReferenceException ();
}
そして、言語が私たちのためにそれをすべて行うので、これは本当にやり過ぎです。
条件の意味を逆にすることをお勧めします—おそらくあなたの同僚はこれでより快適になるでしょう:
p = new Object ();
if ( p == null ) {
throw new NullReferenceException ();
}
else {
p.field = value;
}
これで、elseラッパーの削除を主張できるようになりました。これは、明らかに不要であるためです。
p = new Object ();
if ( p == null ) {
throw new NullReferenceException ();
}
p.field = value;
これにより、「念のため」が条件付きになりましたが、後続のコードは条件付きではありません。このアプローチは、割り当てが失敗したときに、このメソッドや呼び出しチェーンでコードを実行し続けるのではなく、適切な応答がスローされることをさらに強化します(割り当て失敗の他の適切な処理なしで)。
したがって、要約すると、この慣行に対してここで論理的に推論される2つの議論があります。
- メモリ不足(またはコンストラクターの失敗)がnullを返すことを強制できないため、より高いコードカバレッジレベルに到達できません。
- 「念のため」(質問で上記に示されているように)は不完全であり、そのため、nullがを超えて/過去の他のコードによってどのように処理されるかについての期待に一貫性がないため、欠陥があります
p.field = value;
。
基本的に、おそらくあなたの同僚は例外の使用について垣間見えているように思われます—そのようなことをここではC#で行うことはできませんが。(十分にテストされたコードが必要な場合は、nullを処理するための例外モデルと、nullの戻り値を並べて使用する非例外モデルの両方をコード化することはできません。)彼らはいくつかの光を見るでしょう!