2017-11-12 20 views
3

キーワードを使用してメソッドの前提条件と事後条件を確認することについてOracle documentationを読んでいました。パブリックメソッドでの前提条件と事後条件チェック

文書は、それがpublicメソッドの事後条件を確認するためにassertキーワードを使用して大丈夫ですが、あなたは唯一のprivateメソッドのための前提条件を確認するためにassertキーワードを使用する必要があることを述べています。

これはなぜですか?

+3

ソースを共有できますか? – assylias

+0

ここはどこかにあります:https://docs.oracle.com/javase/7/docs/technotes/guides/language/assert.html – Ogen

+0

Java 7と言えますが、テキストは明らかに古いものです。別のビューの場合:https://stackoverflow.com/a/37605954/829571 – assylias

答えて

4

コメントにダンプするのではなく、完全な答えです。

パブリックメソッドの引数チェックにアサーションを使用しないのはなぜですか?

assertに依存するアサーションは、JVMフラグによって無効にすることができます。したがって、ユーザーがコードを実行したときにアサーションが実際に実行されることを保証する方法はありません。そのため、実際にAPIを使用することが保証できない場合は、APIに検証エラーを投げるという約束をするのは悪いことです。したがって、警告を出すために例外をスローせずに、ユーザーが無効なパラメータであなたに電話することを許可します。代わりにランタイム例外を使用する必要があります。

それでは、パブリックメソッドの後条件に使用するのはなぜですか?

あなたは次のように定義が事前と事後条件引用されたドキュメント:

事前条件 - メソッドが呼び出されたときに真でなければならないものを。 事後条件 - メソッドが完了した後に真でなければならないもの

事前条件は発信者に依存し、後条件は着信者によって異なります。事前条件が満たされた場合、ポスト条件が失敗する唯一の理由は、メソッド内のコードがバグであるためです。これはユーザーの間違いではなく、図書館自体の問題です。私はそれが、障害者のポスト条件アサーションに終わることはそれほど問題ではないとドクターが信じている理由だと推測しています。

事後条件が満たされないと、おそらくメソッドの契約が破られ、実行が停止する可能性があるため、個人的には同意できません。事後条件がいかに重要であるかによって異なります。 APIライターは、ダイナミック配列のサイズ変更の最後で、ある比率がパフォーマンスに最適かどうかチェックしたいかもしれませんが、最適ではない比率でもプログラムが期待どおりに動作するため、例外ではありません。

4

すべての場合、public関数の引数をチェックする必要があります。 assertが無効になっている場合、assertによって実装されていると、このようなチェックは行われません。

+0

私は、公開されたメソッドの事後条件を検証するのはなぜ大丈夫ですが、前提条件は検証できないのでしょうかと尋ねています。私はまだ混乱しています。私の質問は答えられたとは思わない。 – Ogen

+2

'assert'に依存する@Ogenアサーションは、JVMフラグによって無効にすることができます。したがって、ユーザーがコードを実行したときにアサーションが実際に実行されることを保証する方法はありません。そのため、実際にAPIを使用することが保証できない場合は、APIに検証エラーを投げるという約束をするのは悪いことです。代わりにランタイム例外を使用する必要があります。 – Dici

+0

これは、呼び出し元がアサーションをオフにしている可能性があるため、アサーションをパブリックメソッドの引数チェックの代わりに使用しないでください。アサーションチェックは実行されません。その場合、パブリックメソッドの事後条件を確認するためにアサーションを使用する理由は何ですか?どうして標準的な議論を使うのはなぜですか? – Ogen

関連する問題