新しい.NETFramework4.0の登場で提供される新機能と拡張機能を完全に理解して活用するために、コードコントラクトの実際のアプリケーションの例を取得したいと思います。
- 誰かがこの機能の適用の良い例を持っていますか?
簡単な説明が付いたコードサンプルを入手して、それを使い始めるのに役立てたいと思います。
新しい.NETFramework4.0の登場で提供される新機能と拡張機能を完全に理解して活用するために、コードコントラクトの実際のアプリケーションの例を取得したいと思います。
簡単な説明が付いたコードサンプルを入手して、それを使い始めるのに役立てたいと思います。
コントラクトを使用すると、実行時チェック、静的分析、およびドキュメント化のために、コード内で前提条件、事後条件、およびオブジェクト不変条件を表現できます。
コードコントラクトは静的検証に使用されます; コンパイル時に、構文エラーだけでなく論理エラーも検出した場合を想像してみてください。これが静的プログラム検証のビジョンです。
コントラクト(および静的検証)を使用して、テストのコストを削減できます...特に回帰テスト。例として、いくつかのビジネスニーズを満たすコードを書いたとしましょう...しかし、後でパフォーマンスのニーズが変化し、最適化する必要があります。最初にコントラクトを作成した後、新しい最適化されたコードが検証されたときに、元のコントラクトが満たされない場合は、コンパイル時エラーが発生した場合と同じように、IDEにエラーメッセージが表示されます。その結果、バグをほぼ即座に見つけて解決できます。これは、1回のテストよりもコストがかかりません。
コードコントラクトに関する無料の章が、次の本C#in Depth、第2版にあります。ジョン・スキートという名前の人によって、あなたの何人かは彼に精通しているかもしれません:)
実用的には。コード内のどこでも使用できますが、特に多くの人が使用するフレームワーク/ APIタイプのライブラリを開発している場合は、非常に便利になると思います。コードの静的検証は、実行時にエッジケースを処理しなかったことを確認する場合に比べて、多くの時間を節約できます。
メソッドの使用法を好きなように文書化できますが、人々は実際にその文書を読むでしょうか?メソッドyの文字列パラメータxをnullにすることは許可されていますか?コードコントラクトはその情報を提供して、方程式から当て推量を取り除くことができます。
このような場合の例を次に示します。
static int CountWhitespace(string text)
{
Contract.Requires<ArgumentNullException>(text != null, "text");
return text.Count(char.IsWhiteSpace);
}
誰かが文字列を渡そうとした場合、検証はCountWhitespace
nullになる可能性があると文句を言います。さらに、実行時にArgumentNullExceptionをスローします。
プライベートクラスライブラリを最近.NET4.0に変換したばかりですが、コードコントラクトをすぐに追加する予定です。
.Netにはコントラクトが使われているところがたくさんあります。 >>ソース<<
NullReferenceException
プログラムがクラッシュするという困難な方法を見つけることを避けるために、コンパイラがコンパイル時にそれについて警告することができたらと思ったことはありますか?
コードコントラクトを使用すると、次のように記述できます。
Contract.Requires(foo != null);
これは単なる実行時チェックではありません。nullの可能性がある引数を指定してこの関数を呼び出すと、コンパイルエラーが発生するように設定できます。
これが実際の例です:
Address GetAddress(Customer customer)
{
Contract.Requires<ArgumentNullException>(customer != null, "customer");
return addressBook.FindCustomer(customer);
}