null引数のチェックなどのガードメソッドを提供するライブラリまたはソースコードを探しています。明らかに、これは構築するのはかなり簡単ですが、.NET用の何かがすでにそこにあるかどうか疑問に思っています。基本的なグーグル検索はあまり明らかにしませんでした。
6 に答える
CuttingEdge.Conditionsがあります。ページからの使用例:
public ICollection GetData(Nullable<int> id, string xml, ICollection col)
{
// Check all preconditions:
id.Requires("id")
.IsNotNull() // throws ArgumentNullException on failure
.IsInRange(1, 999) // ArgumentOutOfRangeException on failure
.IsNotEqualTo(128); // throws ArgumentException on failure
xml.Requires("xml")
.StartsWith("<data>") // throws ArgumentException on failure
.EndsWith("</data>"); // throws ArgumentException on failure
col.Requires("col")
.IsNotNull() // throws ArgumentNullException on failure
.IsEmpty(); // throws ArgumentException on failure
// Do some work
// Example: Call a method that should not return null
object result = BuildResults(xml, col);
// Check all postconditions:
result.Ensures("result")
.IsOfType(typeof(ICollection)); // throws PostconditionException on failure
return (ICollection)result;
}
ライブラリにパッケージ化されていないが、Paint.Net ブログで簡単にパッケージ化できるもう 1 つの優れたアプローチ:
public static void Copy<T>(T[] dst, long dstOffset, T[] src, long srcOffset, long length)
{
Validate.Begin()
.IsNotNull(dst, "dst")
.IsNotNull(src, "src")
.Check()
.IsPositive(length)
.IsIndexInRange(dst, dstOffset, "dstOffset")
.IsIndexInRange(dst, dstOffset + length, "dstOffset + length")
.IsIndexInRange(src, srcOffset, "srcOffset")
.IsIndexInRange(src, srcOffset + length, "srcOffset + length")
.Check();
for (int di = dstOffset; di < dstOffset + length; ++di)
dst[di] = src[di - dstOffset + srcOffset];
}
私は自分のプロジェクトでそれを使用しており、そこからコードを借りることができます。
Microsoft のCode Contractsが .NET 4.0 で発表されたことを考えると、可能であればほぼ互換性のあるものを見つけようとします。そうでない場合は、自分で作成します。そうすれば、(最終的に) .NET 4.0 にアップグレードするときに、移行がより簡単になります。
使用できる方法はいくつかあります。
私のお気に入りは、アスペクト指向プログラミングを使用することです。PostSharp をチェックしてください。
C# の拡張機能である Spec# も参照してください。
4.0 では、フル機能のコントラクト ライブラリが提供されます。
最後に、私の同僚が非常に便利なガード ライブラリを思いつきました: http://blueonionsoftware.com/blog.aspx?p=ca49cb62-7ea2-43c5-96aa-91d11774fb48
最近、ガード クラスに関する投稿を書きました (情報も見つかりませんでした): http://ajdotnet.wordpress.com/2009/08/01/posting-guards-guard-classes-explained/
それぞれの Guard クラスの実装も公開しました (このコードをそのまま使用するか、必要に応じて調整してください): ajdotnet.wordpress.com/guard-class/
.NET 4.0 (Spec# の後継) における Guard クラスとコード コントラクトの関係については、次の投稿を参照してください: www.leading-edge-dev.de/?p=438
(断片的なリンクで申し訳ありません。このサイトでは 1 つのリンクしか許可されていません...)
こんにちは、AJ.NET
市販されているものは知りません。このタイプのコードは、パターンとプラクティスのエンタープライズ ライブラリでサポートされています。また、CodePlex で (さまざまな程度で) これを行っているように見える多くのオープン ソース プロジェクトもあります: http://www.codeplex.com/Project/ProjectDirectory.aspx?ProjectSearchText=validation。
ほとんどの場合、これらのタイプのライブラリは最終的にカスタム作成され、それらを使用する会社の内部にとどまります。
.NET 4.0 では、Spec# に基づくCode Contractsを使用してこれを行うメカニズムを提供するサポートが提供されます。
netfx-guardnugetパッケージをインストールします。また、notnullおよびnotemptyのコードスニペットを取得し、手動チェックと同じくらい高速に実行されます