Design by Contractは古くて新しい技術です。結構前から提唱されてる概念で、実践してみるとものすごく効果があるのになかなか世の中に広まっていかないのは、おそらく一つは厳密なContractを書くのがあまりにもめんどくさいということと、ツールが充実していないということがあると思います。
Eiffelの様に言語自体にDbCの機能が組み込まれている言語ならいざ知らず、JavaでDbCを実践しようとするのは大変です。JDK1.4からは一応assertキーワードが使えるようになってますが、単純に式がtrueかどうかをチェック出来るだけというのはあまりにもシンプルすぎる気がします。
JavaでDbCを実践できるツールとしてはJML
を試そうとした事がありますが、日本語がうまいこと通らない等の問題があって挫折しました。(2004/3月時点)
以前、 JavaDocに自然言語ベースでContractをがりがりと書いてDbC的なことをやったこともがあるのですが、その時はJUnitのテストケースのコーディング量が本体の3倍くらいになって、あやうく開発メンバーを殺すところでした。アサーションのコードをいちいち書くのがめちゃくちゃめんどくさいのです。やはりツールのサポートは不可欠のようです。
いろいろ考えた結果、最近ではAspectJを使ってAspectとしてContractを記述するのが良いのではと考えるようになっています。
JMLと比べて、AspectJが良いとおもった理由はいくつかあります。
1.柔軟性 - おそらくどのようなチェックでもかけられる。またContractと本体のコードは完全に切りはなせるし、必要に応じてアサーションをいれたり外したりも自由。
2.メジャー度 - JMLなどに比べて使ってる人が多くて安心。
3.開発環境-Eclipse AJDT等が使えて便利
4.明解さ:アスペクトとして定義されたContractがどのようにWeavingされるかが、明解に定義されている。Weavingのされ具合を視覚化するツールも充実している。JMLではどのようにアサーションコードを入れ込んでいるのか、謎。
とりあえず簡単なサンプルを作って動かすところまではできてるで、次回こそはそれを紹介したいと思います。
Eiffelの様に言語自体にDbCの機能が組み込まれている言語ならいざ知らず、JavaでDbCを実践しようとするのは大変です。JDK1.4からは一応assertキーワードが使えるようになってますが、単純に式がtrueかどうかをチェック出来るだけというのはあまりにもシンプルすぎる気がします。
JavaでDbCを実践できるツールとしてはJML
を試そうとした事がありますが、日本語がうまいこと通らない等の問題があって挫折しました。(2004/3月時点)
以前、 JavaDocに自然言語ベースでContractをがりがりと書いてDbC的なことをやったこともがあるのですが、その時はJUnitのテストケースのコーディング量が本体の3倍くらいになって、あやうく開発メンバーを殺すところでした。アサーションのコードをいちいち書くのがめちゃくちゃめんどくさいのです。やはりツールのサポートは不可欠のようです。
いろいろ考えた結果、最近ではAspectJを使ってAspectとしてContractを記述するのが良いのではと考えるようになっています。
JMLと比べて、AspectJが良いとおもった理由はいくつかあります。
1.柔軟性 - おそらくどのようなチェックでもかけられる。またContractと本体のコードは完全に切りはなせるし、必要に応じてアサーションをいれたり外したりも自由。
2.メジャー度 - JMLなどに比べて使ってる人が多くて安心。
3.開発環境-Eclipse AJDT等が使えて便利
4.明解さ:アスペクトとして定義されたContractがどのようにWeavingされるかが、明解に定義されている。Weavingのされ具合を視覚化するツールも充実している。JMLではどのようにアサーションコードを入れ込んでいるのか、謎。
とりあえず簡単なサンプルを作って動かすところまではできてるで、次回こそはそれを紹介したいと思います。