- PR -

[Re:Java TIPS:095] アサーションはどのように使うもの?

1
投稿者投稿内容
matobaa
常連さん
会議室デビュー日: 2002/12/26
投稿数: 21
投稿日時: 2004-10-26 18:50
Java TIPS で紹介されている「アサーション」について質問です。
メソッドの事前条件や事後条件の確認として、JDK1.4から導入された assert を用いて検証ができる、という主旨の記事ですが、疑問があります。
# 議論しやすいよう、番号をつけています。

例として挙げられているプリペイドカードの例で言えば、
[1] 支払い価格が残高を超えていないことを assert を用いて確認していますが、ここは本来、「if文でそれを判定して適切な例外を発生させる」というロジックを、プリペイドカードが当然持っているべきではないかと思います。
[2] 一方、(上述のif文を記述した上で)事後条件として残高が負でないことを確認するのは、事後条件として適切であるので、assert を用いて確認するのも妥当だといえると思います。
[3] かといって、もしなんらかのバグが潜んでいて処理後の残高が負になってしまうような場合、リリース後の(おそらく-disableassertionsである)環境でみすみす見逃すというのも、なんだか釈然としません。

結局、どのような場合に assert を使って検証を行え、かつ assert を使って検証を行うべきなのでしょうか?
らぶま
常連さん
会議室デビュー日: 2004/10/21
投稿数: 32
投稿日時: 2004-10-26 19:38
らぶまです。

個人的にはassertは例外が適切に使える環境では不要だと思っています。
同等のことができますし。

勿論、例外もあるでしょう。
組み込み系ソフトのように、パフォーマンスが優先される場合ですね(最近は組み込みJavaなんてのもあるらしいし、よく知らないけど)。
クラスすら「遅い!!」といわれる世界ですし、例外処理なんてもってのほかなんでしょうね。
assertならリリース時に簡単にはずせるってところがミソなんでしょう。
例外処理を一個ずつコメントアウトするのは大変です・・
佐々木
大ベテラン
会議室デビュー日: 2003/03/30
投稿数: 121
投稿日時: 2004-10-26 20:03
この文書
http://java.sun.com/j2se/1.4/ja/docs/ja/guide/lang/assert.html
は参考になります。

例えばこんなのとか。
引用:

public メソッドのパラメータのチェックにはアサーションを使用しないでください。 public メソッドは、常に引数チェックを適用することを保証するので、assert は適していません。 public メソッドは、アサーションが有効かどうかにかかわらず引数をチェックする必要があります。


参照元記事ではこれをやっちゃってますが。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2004-10-26 20:07
私的には、アサーションは業務ロジックでの値チェックに
使用するようなものではないと思っています。
テストケースをソースに記述する為に使用するという認識です。

例えば、開発途中でDBのインサート前に
値のチェックをやることが多いと思います。
通常その場で入力値が不正ならばエラー処理に遷移すると思いますが、
この場合、入力値チェック後とインサート前の間に
アサーションを行うのが適切ではないかなと思います。

テストケースでアサーションエラーが発生すれば、
入力値のチェックロジックに漏れが存在するというのも確認できます。
matobaa
常連さん
会議室デビュー日: 2002/12/26
投稿数: 21
投稿日時: 2004-10-27 23:20
らぶまさん、佐々木さん、かつのりさん、返信ありがとうございます。
佐々木さんが挙げられたURLを見てみました:
引用:
アサーションが登場するまで、多くのプログラマは、コメントを使用してプログラムの動作に関する前提を示していました。 ……現在では、不変条件を表明するコメントを記述したときには常にアサーションを使用する必要があります。


これで納得がいきました。assert =「表明」であり、プログラマや設計者の意思表示のためだけに用い、意味のあるロジックを書いてはいけない、と。
いい機会なので、「プログラミング作法」や「ライティングソリッドコード」を読んでみようと思いました。

Java TIPSの記事ではこのへんまで言及してほしかったですね。
1

スキルアップ/キャリアアップ(JOB@IT)