Assert

先日会社で事前・事後・不変条件のチェックについて同僚と意見交換しました。

現状は、業務アプリケーションで意識して取り入れられているところなんてほとんどないようで・・・。

プロジェクト側に動機付けを行う必要があるんでしょうね。やれ!っていうと「工数が増える」とプロジェクト側の心が折れちゃうから、「なぜ必要か」を訴えないといけないでしょうね。

で、次は実際のコード。
Javaのassertって使われてないよね。私は意識して使うようにしてたんだけど、それってコードを見たときに「あ、こういう条件があるんだね」というノートみたいに使ってた。もったいないんだけど、使おうとしたときめんどい。
デフォルトで使えないのがいけないのかなー。

そして、事後・不変がチェックしづらいこと。たぶん、今のままじゃ現実的じゃないよね。

最後にどのように記述するか。
昔はアノテーションでと思っていた。そしてJavaDocにもちゃんと記述すべきと思っていた。
まずアノテーションについては、複雑なものを書いてしまうと、なんか読みにくい気がしてるんですよね。表現力が乏しくて・・・。確かにいろいろ記述すれば事前条件のチェックくらいできそうですが、長くなる・・・。引数にアノテーションをつけるとコードとして読みにくい。
なので、こういうのはやっぱりブロック内にコードとして表現していいんじゃないかと思った。そしてその記述には『流れるようなインターフェース』で。もちろん同じこと考えてる人たちはいるようで・・・。

http://fest.easytesting.org/assert/wiki/pmwiki.php

これだと、読みやすく、ちょっと難しいチェックにも耐えられそう。欠点は無効にできないこと(調べ切れてないので、ほんとはできるかもしれないのですが)。凝ったチェックだと遅くなるので、やっぱりはずしたいよねー。

そしてJavaDocに記述。これはどうだろう・・・。文章で書くと手が止まっちゃうよね(少なくとも、日本語が下手な私は・・・)。記述のルールを設ければいいけど、上のAssertライブラリができることをカバーできる記述ルールを覚えるのは難しい・・・。なので、私はオプションかなと思ってます。まずは、「はじめることが重要」ってことで(はじめが重要だと、はじめるのにコストがかかっちゃうから)。

これってValidationにも使えそう。単純なのはプロパティに対してアノテーションで。複雑なのは流れるようなインターフェースをもったValidation。そういうのないかなー。