プログラムの品質向上手法として、契約による設計(Design by Contract、以下DBC)という手法があります。DBCでは、あるオブジェクトに対するメソッド呼び出しを行っているとき、プログラムが正しく動作している際に満たされるべき条件として、以下の3条件を規定しておきます。
以上の3条件のうちいずれかの条件が満たされない場合、プログラムは正しく動作していない、つまりバグがあることになります。
例として、ある実数xの平方根yを計算するメソッドを作成する場合の事前条件と事後条件について考えます。実数xが0以上の値でなければ平方根を求めることができないため、xが0以上というのが事前条件になります。また、平方根の値は必ず0以上になるため、yが0以上というのが事後条件になります。事前条件を満たさない事態が発生した場合は、メソッドの呼び出し元にバグがあることになりますし、事後条件を満たさない事態が発生した場合は、平方根を求めるメソッド自身にバグがあることになります。このように、DBCを用いるとバグの原因を追究しやすくなり、結果としてプログラムの品質を向上させることができます。
J2SDK 1.4からはアサーションが使用可能になりました。アサーションはある条件をチェックし、条件が偽になったときにAssertionError例外を発生させる構文です。アサーションは実行時に有効・無効にするかを決定できるため、デバッグ時にはアサーションを有効にしてデバッグを容易にし、リリース時には無効にして処理速度を向上させる、といったことが可能になります。DBCの手法をJavaに適用する場合は、条件設定としてアサーションを用いると便利です。
アサーションは以下のいずれかの書式で記述します。
assert 条件; |
「条件が偽になった際に表示される文字列」として、String以外のオブジェクトを記述した場合は、当該オブジェクトのtoString()メソッドの戻り値が表示される文字列になります。
アサーションを有効にするには、コンパイル時のjavac、および実行時のjavaコマンドでオプションを指定する必要があります。コンパイル時には「-source 1.4」オプションを追加します。このオプションを追加しないとコンパイル時にアサーションが取り除かれます。コンパイル時にオプションを追加した例を以下に示します。
javac -source 1.4
MyAssertion.java |
実行時には、「-ea」または「-enableassertions」オプションを追加します。このオプションを追加しないと、実行時にアサーションは無視されます。実行時にオプションを追加した例を以下に示します。
java -ea MyAssertion |
アサーションを用いて、DBCの事前条件・事後条件を指定するサンプルコードを以下に示します。以下のサンプルコードでは、プリペイドカードの残高を管理するクラスにおいて、カードの初期作成時と、カードで買い物をする際に正しい処理が行われているかどうかをアサーションでチェックしています。
public class PrepaidCard { |
価格:300 残高:700 |
Copyright © ITmedia, Inc. All Rights Reserved.