この質問で言及されているガードメソッド/クラスに気付きましたが、回答からその概念を実際には理解していません。残念なことに、Jon Skeet の MS サイトへのリンクが読み込まれませんでした。いくつかの簡単な Google 検索では、ソフトウェア エンジニアリングの概念ではなく、製品のみが得られるように見えました。
説明やサンプルをいただければ幸いです。(特に .Net 側から。)
ガード句はアスペクト指向プログラミングの一部であり、メソッドへの許容可能な入力を定義できます。
私が知っている .Net 実装 (実際には調べていません) から、属性を使用してこれを行います。
public static void NeverGetNull([ThisParamNotNull]MyClass i, [ThisParamNotNull]OtherClass j)
{
// Will never need to check for null values on i or j!
}
メソッドディスパッチがガードメソッドに依存しているErlangのガード式が何であるかを実際に知っています。ポイントを説明するために、以下に少し疑似コードを示します。
myMethod(input i) where i is an int
{
return i + 10
}
myMethod(input i) where i is an int and i > 10
{
return i - 10
}
var i = myMethod(1) // returns 11
var i = myMethod(i) // returns 1
明らかではないかもしれませんが、ディスパッチ中に評価される式をガードに提供できます。かなりきれいですね。
例外を指定しない場合、.NET は をスローしますが、またはRaiseContractFailedEvent
を指定できます。ArgumentOutOfRangeException
ArgumentNullException
Jon Skeet のリンクを見ると、ドキュメントの pdf で多くの例が表示されます。1 つは次のとおりです。
Contract.Requires( x ! = null );
これは、前提条件と事後条件を指定する契約設計の一部です。利点は、入力パラメーターを使用する前に多くの検証を行う必要がないことです。これにより、結果がコントラクトに従っていることを呼び出し元の関数が知ることができるため、文字列の戻り値が許可されていない場合null の場合、事前条件チェックにより、関数を呼び出すときに null をテストする必要はありません。