0

この質問に続いて: != null ステートメントを回避 する 私は、上級開発者の 1 人に、なぜアサーションを使用しないのかを尋ねました。彼の答えは妥当であることが証明されましたが (カスタム例外を使用しています)、アサーションは開発およびテスト中に使用することを意図しており、本番環境では使用しないと主張しました。

しかし、Oracle のドキュメント http://docs.oracle.com/javase/6/docs/technotes/guides/language/assert.html では、アサーションはテストを超えて使用されることを意図しているように見えます。

では、アサーションを使用しないより良い理由や良い習慣はありますか?

4

1 に答える 1

0

アサーションは、言語によって異なる動作をします。C では、これらはしばしば誤って使用され、誤った使用法が非常に一般的であるため、多くの人がそれらをまったく使用しないようにアドバイスしています。NDEBUGこれらは実行を遅くするだけなので、本番環境では使用しないでください (つまり、C の本番コンパイルではプリプロセッサ用に定義する必要があります)。

アサーションの目的は、結果を確認することではなく、論理的な必要性を述べることにあります。たとえば、(C では) 次のように書くのが正しいです。

f = malloc( s );
if( f == NULL ) {
   ...; exit( 1 );
}
assert( f != NULL );   # This is logically necessary.

しかし、これまでに書くのは完全に間違っています:

f = malloc( x );        # THIS IS AN EXAMPLE OF INCORRECT USAGE
assert( f != NULL );    # DO NOT DO THIS

次のように書くことは完全に有効であるため、これは実際に便利です。

f = xmalloc( x );
assert( f != NULL ); 

これは、null 値を決して返さないような方法で xmalloc が定義されていることを読者に説明するものです。

関数の開始時によく使用されます。

void f( void *p ) { assert( p != NULL ); ... }

このような使い方はエラーチェックではありません。むしろf、NULL ポインターが渡されないことを関数が想定していることを示す役割を果たします。null ポインターを渡すことfはプログラミング エラーであることを開発者に説明します。これをアサーションにすると、アサーションが有効なときに実行時にエラーを検出できるようになります。

于 2013-02-20T16:56:54.087 に答える