1.4 以降の SDK なら, Eiffel*1 由来の assertion が使える.ほぉ.というわけで,テスト用にコード片を.あ,ただしスクラップブックでは効かんようだ.
double mustBePositive = 4.0; assert mustBePositive >= 0.0 : "mustBePositive must be positive: " + mustBePositive; System.out.println(Math.sqrt(mustBePositive)); mustBePositive = -4.0; assert mustBePositive >= 0.0 : "mustBePositive must be positive: " + mustBePositive; System.out.println(Math.sqrt(mustBePositive));
以上のようなコード片を実行させると,コンソールには以下のように表示される. 1 回めの表明はきちんと通過して 2 回めの表明でチェックされた結果が false になるので AssertionError 例外が投げられて,以下の println が実行されていないのが判る.
2.0 Exception in thread "main" java.lang.AssertionError: mustBePositive must be positive: -4.0 at myTest.MyTest.main(MyTest.java:46)
設定方法等は以下を見てくれぃ.
- アサーションを使用したプログラミング Sun の公式ドキュメント. (原文)
- @IT:Java TIPS -- Eclipse 3.0でアサーションを使用する
- @IT:Java TIPS -- プログラムの品質を高めるためのアサーションとは?
表明にはつきものの事前条件,事後条件にももちろんクラス不変表明にも使えるわけだが,単独で assert 文を取り出した場合,字面が同じなのでそれがどれに該当しているのは判らない. return の直前で戻り値をチェックしてるから事後条件だろうとか, private メソッド*2の頭で引数をチェックしてるから事前条件だろうとか判る程度だ.つまり位置情報が必要. Eiffel の場合は,それぞれ, require, ensure, invariant というキーワードで始まるブロックの形をしているので,見ただけで判る.
あ,日本語ドキュメントではカタカナで「アサーション」になっとるな. Java な集まりで「表明」とか言ったら,「この Eiffel オタク,カエレ (半角)!」って虐められるんだろうか (笑).
Mac de Eclipse という見出しにも関わらず, Mac とは関係ない一般的な話になっちまったぃ.
*1: ちなみに前述の Eiffel サイトからは Panther 用の EiffelStudio という開発環境がリリースされておるようだ.しかも, X11 が必要なんだと.ダメだ,こりゃ.インストーラは OS のバージョン・チェックしてねぇし (Apple の Java updater はちゃんとチェックして刎ねる).お値段は「US$ 4,799.00 per license」.た,高価ぇ〜.
*2: 原文に
Do not use assertions to check the parameters of a public method. An assert is inappropriate because the method guarantees that it will always enforce the argument checks. It must check its arguments whether or not assertions are enabled.
とある.訳文はこちら.
public メソッドのパラメータのチェックにはアサーションを使用しないでください。 public メソッドは、常に引数チェックを適用することを保証するので、assert は適していません。 public メソッドは、アサーションが有効かどうかにかかわらず引数をチェックする必要があります。
[ アサーションを使用したプログラミング: 事前条件 より ]
0 件のコメント:
コメントを投稿