- - PR -
[Re:Java TIPS:095] アサーションはどのように使うもの?
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2004-10-26 18:50
Java TIPS で紹介されている「アサーション」について質問です。
メソッドの事前条件や事後条件の確認として、JDK1.4から導入された assert を用いて検証ができる、という主旨の記事ですが、疑問があります。 # 議論しやすいよう、番号をつけています。 例として挙げられているプリペイドカードの例で言えば、 [1] 支払い価格が残高を超えていないことを assert を用いて確認していますが、ここは本来、「if文でそれを判定して適切な例外を発生させる」というロジックを、プリペイドカードが当然持っているべきではないかと思います。 [2] 一方、(上述のif文を記述した上で)事後条件として残高が負でないことを確認するのは、事後条件として適切であるので、assert を用いて確認するのも妥当だといえると思います。 [3] かといって、もしなんらかのバグが潜んでいて処理後の残高が負になってしまうような場合、リリース後の(おそらく-disableassertionsである)環境でみすみす見逃すというのも、なんだか釈然としません。 結局、どのような場合に assert を使って検証を行え、かつ assert を使って検証を行うべきなのでしょうか? | ||||
|
投稿日時: 2004-10-26 19:38
らぶまです。
個人的にはassertは例外が適切に使える環境では不要だと思っています。 同等のことができますし。 勿論、例外もあるでしょう。 組み込み系ソフトのように、パフォーマンスが優先される場合ですね(最近は組み込みJavaなんてのもあるらしいし、よく知らないけど)。 クラスすら「遅い!!」といわれる世界ですし、例外処理なんてもってのほかなんでしょうね。 assertならリリース時に簡単にはずせるってところがミソなんでしょう。 例外処理を一個ずつコメントアウトするのは大変です・・ | ||||
|
投稿日時: 2004-10-26 20:03
この文書
http://java.sun.com/j2se/1.4/ja/docs/ja/guide/lang/assert.html は参考になります。 例えばこんなのとか。
参照元記事ではこれをやっちゃってますが。 | ||||
|
投稿日時: 2004-10-26 20:07
私的には、アサーションは業務ロジックでの値チェックに
使用するようなものではないと思っています。 テストケースをソースに記述する為に使用するという認識です。 例えば、開発途中でDBのインサート前に 値のチェックをやることが多いと思います。 通常その場で入力値が不正ならばエラー処理に遷移すると思いますが、 この場合、入力値チェック後とインサート前の間に アサーションを行うのが適切ではないかなと思います。 テストケースでアサーションエラーが発生すれば、 入力値のチェックロジックに漏れが存在するというのも確認できます。 | ||||
|
投稿日時: 2004-10-27 23:20
らぶまさん、佐々木さん、かつのりさん、返信ありがとうございます。
佐々木さんが挙げられたURLを見てみました:
これで納得がいきました。assert =「表明」であり、プログラマや設計者の意思表示のためだけに用い、意味のあるロジックを書いてはいけない、と。 いい機会なので、「プログラミング作法」や「ライティングソリッドコード」を読んでみようと思いました。 Java TIPSの記事ではこのへんまで言及してほしかったですね。 |
1