【3/18〜】Amazon、VMwareが語る『クラウドの未来』 スラッシュドット    はてなブックマーク  Yahoo!ブックマークに登録  印刷


   Javaプログラミング編
プログラムの品質を高めるためのアサーションとは?

WINGSプロジェクト
BULL
2004/10/27

■契約による設計(Design by Contract)

 プログラムの品質向上手法として、契約による設計(Design by Contract、以下DBC)という手法があります。DBCでは、あるオブジェクトに対するメソッド呼び出しを行っているとき、プログラムが正しく動作している際に満たされるべき条件として、以下の3条件を規定しておきます。

  • 事前条件…… メソッド呼び出し時の引数が満たすべき条件
  • 事後条件…… メソッドによる処理が終了した時点で満たすべき条件
  • 不変条件…… メソッドによる処理により変化しないものを規定する条件

 以上の3条件のうちいずれかの条件が満たされない場合、プログラムは正しく動作していない、つまりバグがあることになります。

 例として、ある実数xの平方根yを計算するメソッドを作成する場合の事前条件と事後条件について考えます。実数xが0以上の値でなければ平方根を求めることができないため、xが0以上というのが事前条件になります。また、平方根の値は必ず0以上になるため、yが0以上というのが事後条件になります。事前条件を満たさない事態が発生した場合は、メソッドの呼び出し元にバグがあることになりますし、事後条件を満たさない事態が発生した場合は、平方根を求めるメソッド自身にバグがあることになります。このように、DBCを用いるとバグの原因を追究しやすくなり、結果としてプログラムの品質を向上させることができます。

■アサーションの概要

 J2SDK 1.4からはアサーションが使用可能になりました。アサーションはある条件をチェックし、条件が偽になったときにAssertionError例外を発生させる構文です。アサーションは実行時に有効・無効にするかを決定できるため、デバッグ時にはアサーションを有効にしてデバッグを容易にし、リリース時には無効にして処理速度を向上させる、といったことが可能になります。DBCの手法をJavaに適用する場合は、条件設定としてアサーションを用いると便利です。

 アサーションは以下のいずれかの書式で記述します。

assert 条件;
assert 条件 : 条件が偽になった際に表示される文字列;

 「条件が偽になった際に表示される文字列」として、String以外のオブジェクトを記述した場合は、当該オブジェクトのtoString()メソッドの戻り値が表示される文字列になります。

 アサーションを有効にするには、コンパイル時のjavac、および実行時のjavaコマンドでオプションを指定する必要があります。コンパイル時には「-source 1.4」オプションを追加します。このオプションを追加しないとコンパイル時にアサーションが取り除かれます。コンパイル時にオプションを追加した例を以下に示します。

javac -source 1.4 MyAssertion.java

 実行時には、「-ea」または「-enableassertions」オプションを追加します。このオプションを追加しないと、実行時にアサーションは無視されます。実行時にオプションを追加した例を以下に示します。

java -ea MyAssertion

■アサーションの例

 アサーションを用いて、DBCの事前条件・事後条件を指定するサンプルコードを以下に示します。以下のサンプルコードでは、プリペイドカードの残高を管理するクラスにおいて、カードの初期作成時と、カードで買い物をする際に正しい処理が行われているかどうかをアサーションでチェックしています。

PrepaidCard.java
public class PrepaidCard {
  public int amount;

  public PrepaidCard(int precharge) {
    assert precharge >= 0 : "初期残高が不正です";//事前条件

    amount = precharge;

    assert amount >= 0 : "残高が不正です";//事後条件
  }
  public void pay(int price) {
    assert price >= 0 : "価格が負になっています 価格:" + price; // 事前条件
    assert amount >= price : "価格が残高を超えています 価格:" + price + " 残高:" + amount; //事前条件

    amount -= price;
    System.out.println("価格:" + price +  " 残高:" + amount);
    
    assert amount >= 0 : "残高が不正です"; //事後条件
    
  }

  public static void main(String args[]) {
    PrepaidCard card = new PrepaidCard(1000);//1000円のプリペイドカードを作成
    card.pay(300);//300円の正常な買い物
    card.pay(500);//500円の正常な買い物
    card.pay(-200);//不正な買い物
  }
}

実行結果
価格:300 残高:700
価格:500 残高:200
Exception in thread "main" java.lang.AssertionError: 価格が負になっています 価格:-200
at PrepaidCard.pay(PrepaidCard.java:12)
at PrepaidCard.main(PrepaidCard.java:26)

 

「Java TIPS」

ホワイトペーパーTechTargetジャパン

Java Solution フォーラム 新着記事

@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

RSSフィード

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

- PR -
- PR -

お勧め求人情報

キャリアアップ 〜JOB@IT
@IT Special -PR-
  TomcatやJBossなどAPサーバ環境に関する
情報を集約! “業務”用APサーバ大百科

New!
  一気に解説! 最新のクラスタストレージ
「RAIDを超えたストレージ基準」……など

New!
  クラウド的ユーザー体験の変化は脅威か?
仮想化技術を使いこなす運用管理術を紹介

New!

  上司や部下、部署内メンバーとの情報共有
を“ガラッ”と変えるコラボツールとは?

New!
  おばかアプリ選手権、第4弾開催中!!
ムダにカッコよくてくだらない作品求ム!

  社内ファイルサーバを“クラウド”に統合
VPN直結「クラウド型ストレージ」を紹介

  Twitterのアカウントはなぜ突破された?
メールによる新手の攻撃手法とその対策

  もう仮想化のお試しフェイズは終わりだ!
Hyper-V 2.0が基幹システムも仮想化

  美人!? まあまあ? 気になる いやし系!!
PV急増で「美人時計」がとった手段とは?

  クライアント企業から求められる人材
⇒IT技術と経営戦略を併せ持つ「戦略家」

  .NET編集長が実践する「技術情報検索術」
サンプル・コードを簡単に探す“技”は?

  業務効率と情報セキュリティ対策を両立!
手間なく確実に機密情報を守る方法とは?

  進化を続ける富士通ストレージETERNUS DX
製品開発者の自信を裏付けるものとは何か

  運用管理の課題を“2つの観点”から分析
ユーザー満足度の高い「仮想環境」とは?

  【CTC事例】約30の基幹システムを統合!
膨大なバッジジョブを制御した方法は?

  仮想化すればコストは削減できるか?
仮想化に必要な「3つの視点」を解説する

  その数、なんと400台以上! グループ内
サーバの「統合管理」によるメリットは?