4

明白な答えを持つばかげた質問のように聞こえます:)

それでも私は、二重に確信を持って尋ねることを敢えてしました。

実際に以下のようなアサートを使用しています

ArrayList alProperties = new ArrayList();

assert alProperties != null : "alProperties is null";

問題は、アサーションに関する小さくてシンプルなドキュメントを作成するのが難しいことです。アサートに関する本はたくさんありますが、新しいプログラマーにアサートのようなものを使用するための非常に簡単なガイドラインを提供するのが理想的です。ところで、pmd のようなツールはアサートの適切な使用をチェックしますか?

前もって感謝します。

4

9 に答える 9

20

そのようなアサートを使用する正当な理由はありません。何らかの理由でオブジェクトが作成されない場合、アサートに到達することさえありません (たとえば、例外がスローされたか、VM が終了したため)。

于 2009-07-09T12:09:06.987 に答える
6

Sun のProgramming with Assertions には、アサーションの使用に関するかなり簡潔なガイドラインがいくつかあります。その記事では、内部不変条件、制御フロー不変条件、事前条件、事後条件、およびクラス不変条件などにアサートを使用する必要があることをアドバイスしています。

于 2009-07-09T12:16:15.267 に答える
4

いいえ、オブジェクトの作成をチェックしたくありません。

オブジェクトの作成に失敗した場合、jvm は OutOfMemoryError をスローします。これが発生した場合、いずれにせよ修復不可能な状態になる可能性があります。

于 2009-07-09T12:17:01.913 に答える
3

それは、JVM を信頼していないようなものです。当たり前と思っていることと、どこかで線を引かなければならない…

于 2009-07-09T12:13:34.610 に答える
3

Java では、new を呼び出すたびに、新しいオブジェクトへの null 以外の参照が返されるか、例外またはエラーが発生します。最初のケースでは、アサートは true です。2 番目のケースでは、次の一致する catch ブロックで終了するため、アサートに到達しません。

このアサートは、Java 実装が壊れているかどうかをテストします。この場合、アサートに頼ることさえできません。だから私はそのような主張をしません。言語によって適用されないオブジェクトの制限には assert を使用します (たとえば、メソッドに null であってはならないパラメーターが渡された場合)。

于 2009-07-20T11:53:26.343 に答える
3

このアサートはコードを乱雑にするだけで、次のアサートと同等です。

boolean a = true;
assert a : "A should be true"

それがあなたのプログラムのポイントでない限り、あなたはあなたのJVMをテストするべきではありません(例えば、それはあなたが作っているJVMのテストスイートです)。代わりに、事前条件、事後条件、および不変条件をテストする必要があります。これらのテストは基本的すぎたり、費用がかかりすぎたりする場合があります。

前提条件は、おそらくメソッドの開始時にのみ表示する必要があります (非常に長いメソッドがある場合は、それらがすべてプライベートであっても、そのメソッドを小さな部分に分割する必要があります)。

事後条件は、呼び出し元に何を返したかを明確にする必要があります。sqrt 関数が sqrt を返しただけかどうかはテストしませんが、期待していることを明確にするために肯定的かどうかをテストすることはできます (おそらく後のコードでは複素数であり、あなたのものはそのためにテストされていません)。代わりに、一番下にコメントを残してください。

不変条件もテストできないことがよくあります。現在の解が正しい部分解であることをテストすることはできません (以下を参照)。代わりに、コメントで不変条件を宣言します。

外部から物事を呼び出す場合は、アサートも使用します。たとえば、例で があった場合はArrayList.Create()、 のアサーション チェックを選択できますnull。ただし、他のコードを信頼していないためです。そのコードを記述した場合、アサーション (コメントまたはその他) をファクトリ メソッド自体に入れることができます。

int max(int[] a, int n) {
  assert n <= a.length : "N should not exceed the bounds of the array"
  assert n > 0 : "N should be at least one"

  // invariant: m is the maximum of a[0..i]
  int m = a[0];
  for( int i = 1; i < n; n++ ) {
    if( m < a[i] )
      m = a[i];
  }

  // if these were not basic types, we might assert that we found
  // something sensible here, such as m != null
  return m;
}
于 2009-07-20T12:14:12.923 に答える
1

あなたの質問を完全に理解できるかどうかはわかりませんが、そのような主張は必要ないと思います。

インスタンスを作成するときに、プログラム フローが続行される場合、インスタンスは null 参照ではありません。

于 2009-07-09T12:12:09.413 に答える
0

ASSERTS でプログラムのプロパティまたは不変条件をチェックする必要があります。これを教える良いドキュメントは、プログラマーがそのようなプロパティについて体系的/方法論的に考えるように促すはずです。

于 2009-07-09T12:12:56.030 に答える
0

アサートが失敗した場合は、アサートを処理するだけでなく、より大きな問題が発生することを信じてください。

そのアサートが失敗した場合は、別の仕事を探す時期だと思います。コンピューターが想定どおりに動作していないためです。それが発生すると、すべての地獄が解き放たれます!

于 2009-07-09T12:18:27.123 に答える