8

多くの人が Java でアサーションを使ってプログラミングしているのだろうか。これは、十分な書面による契約や時代遅れの契約がない大規模なプロジェクトで非常に役立つと思います。特に、Web サービス、コンポーネントなどを使用する場合。

しかし、アサーションを使用するプロジェクトを見たことがありません (JUnit/テスト テストを除く)。

スローされたクラスはErrorであり、Exceptionではないことに気付きました。なぜ彼らはエラーを選ぶのですか?例外が予期せずキャッチされ、ログに記録/再スローされない可能性があるためでしょうか?

コンポーネントを使用してアプリケーションを開発する場合、アサーションをどこに置くのだろうかと思います。

  • コンポーネント側では、パブリック API を介してデータを返す直前に?
  • コンポーネントクライアント側?また、どこでも API が呼び出される場合、アサーション メカニズムを呼び出すファサード パターンをセットアップしますか? (それでは、アサーションとファサードを外部プロジェクトに配置し、クライアント プロジェクトはこのアサーション プロジェクトに依存すると思いますか?)

私はアサーションの使用方法と使用時期を理解していますが、アサーションの実際の経験に基づいた推奨事項を持っている人がいるのだろうか.

4

4 に答える 4

5

ところで、assertJava では を参照しますか。

個人的には、アサーションは不変条件に特に役立つと思います。Java ではアサーション チェックがデフォルトでオフになっていることを考慮してください。-eaアサーション チェックを有効にするには、フラグを追加する必要があります。

つまり、アサーションが壊れるとプログラムが停止する一種のデバッグ モードでアプリケーションをテストできます。一方、リリース アプリケーションではアサーションがオフになり、アサーション チェックに時間のペナルティは発生しません。それらは無視されます。

Java では、アサーションは例外よりもはるかに強力ではなく、まったく異なる意味を持ちます。予期せぬ事態が発生し、それを処理しなければならない場合、例外があります。アサーションは、コードの正確性に関するものです。彼らは、「あるべき」が実際にそうであることを確認するためにここにいます。

特に多くの開発者と作業する場合の私の大まかなポリシーは次のとおりです。

  • パブリック メソッド: 常に引数をチェックし、何か問題がある場合は IllegalArgumentException をスローします
  • プライベート メソッド: アサーションを使用して、null ポインターなどに対して引数をチェックします
  • 複雑なメソッド: 中間結果が要求されたプロパティを満たすことを保証するための中間アサーション

...しかし、実際には、まばらに使用しています。重要な場所またはエラーが発生しやすい場所だけです。

于 2011-01-07T11:18:19.627 に答える
4

アサートのマイナーな使用法については、アサーションをデフォルトで無効にするという悪い決定だったと思います。

Errorの拡張についてErrorはキャッチされることが期待されていない例外であるため、Errorを拡張すると思います。そうすれば、コードに がある場合、アサーションはキャッシュされません。catch(Exception)

使用法については、事前条件、事後条件、またはチェックしたい不変条件のコードの途中が最適です。

于 2011-01-07T11:18:48.553 に答える
1

私の意見では、Java のエラーは例外として扱われるべきです。したがって、開発中およびプライベート メソッドでアサーションを有効にして、コードが正常に動作していることを確認し、無効な値をプライベート メソッドに渡さないようにします。

これらのチェックはパブリック メソッドで行う必要があるため、プライベート メソッドで再度チェックすることはありません。

アサーションを無効にするには:

-da flag in compiler

私の意見では、パブリック メソッドでは、例外をチェックして管理するか、自分でログに記録する必要があります。

于 2011-01-07T11:18:51.200 に答える
-1

アサーションはテスト以外では使用しないでください。本番環境では無効にすることができ、適切なチェックが行われないために深刻な問題が発生する可能性があります。

ただし、それらを使用してプライベートメソッドのパラメーターをチェックすることが許可されているという声明を見てきました。これは、プライベート メソッドに到達したデータが正しいと想定しているためです。そうでない場合、アプリケーションは大きく失敗する可能性があります。

于 2011-01-07T11:19:10.997 に答える