私はアサート、コントラクト、または私が使用している言語で利用可能なあらゆる種類のチェックを書くことの大ファンです。少し気になることの1つは、重複チェックを処理するための一般的な方法が何なのかがわからないことです。
状況例:最初に次の関数を記述します
void DoSomething( object obj )
{
Contract.Requires<ArgumentNullException>( obj != null );
//code using obj
}
その後数時間後、最初の関数を呼び出す別の関数を記述します。すべてがまだメモリ内にあるのでDoSomething
、nullオブジェクトを既にチェックしていることがわかっているので、コントラクトを複製しないことにします。
void DoSomethingElse( object obj )
{
//no Requires here: DoSomething will do that already
DoSomething( obj );
//code using obj
}
明らかな問題:objがnullでないことを確認するためにDoSomethingElse
依存しDoSomething
ています。したがってDoSomething
、これ以上チェックしないことを決定する必要があります。または、別の関数を使用する場合、objはもうチェックされない可能性があります。結局、私はこの実装を書くことにつながります:
void DoSomethingElse( object obj )
{
Contract.Requires<ArgumentNullException>( obj != null );
DoSomething( obj );
//code using obj
}
常に安全で、心配する必要はありません。ただし、状況が大きくなった場合、同じオブジェクトが何度もチェックされる可能性があり、それは複製の一種であり、それはそれほど良くないことです。
このような状況で最も一般的な方法は何ですか?
ArgumentBullException
?それは新しいものです:)