私は大規模なプロジェクトに取り組んでおり、数十の数千の自動テストと100%のコードカバレッジがあっても、途方もない数のエラーが発生しています。発生するエラーの約95%はNullReferenceExceptionsです。
コンパイル時にヌルチェックを強制する方法はありますか?
それを除けば、自分でnullケースのテストを作成しなくても、単体テストでnullチェックを自動的に強制する方法はありますか?
私は大規模なプロジェクトに取り組んでおり、数十の数千の自動テストと100%のコードカバレッジがあっても、途方もない数のエラーが発生しています。発生するエラーの約95%はNullReferenceExceptionsです。
コンパイル時にヌルチェックを強制する方法はありますか?
それを除けば、自分でnullケースのテストを作成しなくても、単体テストでnullチェックを自動的に強制する方法はありますか?
コードコントラクトを調べる必要があります。静的チェッカーは、ハイエンドのVSエディションでのみ使用できますが、基本的にはそれが必要です。
オンラインにはたくさんのリソースがあり、<plug>
コードコントラクトに関する章のプレリリース版をC#の第2版から詳細に読むこともできます-第15章を無料でダウンロードしてください。</plug>
(この章は、コードコントラクトの最新かつ最高のビルドに関しては少し古くなっていますが、大きなものは何もありません。)
100%のコードカバレッジは何の意味もありません。
それは誤った安心感です。
測定しているのは、コードのすべての行を実行していることだけです。
いいえ:
たとえば、火災に対処する手順に「建物が不足している」という1つのステップが含まれている場合、それが100%の場合に発生したとしても、おそらく「消防署に警告し、停止してみてください」火事、そして他のすべてが失敗した場合は尽きます。」
コードコントラクト(.NET 4.0)または特定のIFステートメント(<4.0)のいずれかを具体的に入力してコードを追加しなくても、C#に組み込まれているものは何もありません。
C#8では、null許容でない参照型が導入されています。
.Netプロジェクトは、Nullableオプションを有効にするように変更できます。
<LangVersion>8.0</LangVersion>
<Nullable>enable</Nullable>
コンパイラは区別できるようになります
string
とstring?
NonNullableClass
とNullableClass?
これは技術的な解決策ではなく、社会的な解決策です。参照型が外部コード(別のメソッド呼び出しなど)によって何らかの方法で変更された場合に、nullをチェックせずに参照型にアクセスすることを、環境で受け入れられないようにするだけです。ユニットテストは、古き良きコードレビューに取って代わるものではありません。
コンパイル時にヌルチェックを強制する方法はありますか?
いいえ。コンパイラーは、実行時参照変数がnullを指しているかどうかを判別できません。
また、nullを生成するステートメント(セットとリターン)を除外するだけでも十分ではありません。検討:
public class Customer
{
public List<Order> Orders {get;set;}
}
//now to use it
Customer c = new Customer;
Order o = c.Orders.First(); //oops, null ref exception;
1)Resharperは、コード内のいくつかの重要な場所を確認するように提案できると思います。たとえば、[null参照チェックコード]を追加し、許可されている場合は追加することをお勧めします。
それを試してみてください。もちろん、必要に応じて経験を積むことができます。
2)開発アプリケーションの初期段階で、コードで「Fail Fast」パターン(またはアサーション、アサーション)を使用します
防御的なプログラミングは、これまでのところしか得られません...おそらく、例外をキャッチして他の方法と同じように処理する方がよいでしょう。
これらはどちらもC#3では不可能です。Spec#のようなものを使用する必要があります... C#4にはその一部が組み込まれている可能性があると思いますが、それについてはよくわかりません。
スペック#:http ://research.microsoft.com/en-us/projects/specsharp
コンパイル時にオブジェクトはタイプのみであり、実行時にのみタイプが具体的な値を持つインスタンスに変換されるため、コンパイル時にnullチェックを行うことはできません...ここではnullです。
たぶん、TFSのカスタムコード分析チェックインポリシーを確認する必要があります
.NET Frameworkは、!を使用してコンパイル時のnull参照チェックを実施しようとしていました。修飾子。
public void MyMethod(!string cannotBeNull)
しかし、残念ながら、コンパイル時のチェックはありません。最善の策は、外部の呼び出し元がnull値を渡す回数を最小限に抑えてから、公開されているメソッドにnullチェックを適用することです。
public class ExternalFacing
{
public void MyMethod(string arg)
{
if (String.IsNullOrEmpty(arg))
throw new ArgumentNullException(arg);
implementationDependency.DoSomething(arg);
}
}
internal class InternalClass
{
public void DoSomething(string arg)
{
// shouldn't have to enforce null here.
}
}
次に、適切な単体テストを外部クラスに適用して、ArgumentNullExceptionsを予期します。
私は間違っているかもしれませんが、FxCopには、コードにnull参照チェックを追加することを提案するルールがあると思います。ツールを使用してアセンブリを実行してみて、ツールの内容を確認できます。
Gendarmeをチェックしてください。ビルド後にテストと一緒に実行でき(必要に応じてテストの前に実行できます)、null
チェックに関連するいくつかのルールがあります。かなり簡単に自分で書くこともできます。