前回紹介したコントラクトをもとにStackインターフェースを実装したコードを紹介します。
あらかじめコントラクトが決まっていることで、ポイント1のような箇所でNullを返すのか例外を投げるのかといったありがちな実装上の迷いがなくなります。次に、JUnitのテストケースを一部ですが紹介します。
見て分かる通り、アサーションのコードが一切ありませんね。
このテストケースはあらかじめ前回紹介したAspectJによるコントラクトがWeavingされていることが前提となっています。ですから、実際にはStackImplの呼び出しの前後に事前条件と事後条件のチェックのコードが挿入されることになります。
今回紹介したのは、本当にシンプルなケースです。現実に運用されるシステムはもっと複雑ですし、開発者のスキルの問題などもありますから、実際の開発にAspectJによるDbCを適用するには、もっといろいろなノウハウを蓄積していく必要があると思います。
package sample.dbc; import java.util.ArrayList; /** * Stack. */ public class StackImpl implements Stack { private ArrayList stack = new ArrayList(); public int size() { return stack.size(); } public void push(Object o) { stack.add(o); } public Object pop() { int idx = stack.size() - 1; //ポイント1 if(idx <0) {
あらかじめコントラクトが決まっていることで、ポイント1のような箇所でNullを返すのか例外を投げるのかといったありがちな実装上の迷いがなくなります。次に、JUnitのテストケースを一部ですが紹介します。
/** * testPop2. */ public void testPop3() { Stack s = new StackImpl(); s.push(new String("foo")); s.push(new String("bar")); s.pop(); s.pop(); s.pop(); }
見て分かる通り、アサーションのコードが一切ありませんね。
このテストケースはあらかじめ前回紹介したAspectJによるコントラクトがWeavingされていることが前提となっています。ですから、実際にはStackImplの呼び出しの前後に事前条件と事後条件のチェックのコードが挿入されることになります。
今回紹介したのは、本当にシンプルなケースです。現実に運用されるシステムはもっと複雑ですし、開発者のスキルの問題などもありますから、実際の開発にAspectJによるDbCを適用するには、もっといろいろなノウハウを蓄積していく必要があると思います。