防衛的プログラミングと契約による設計

防衛的プログラミング(Defensive Programming)とは、想定外の状況になってもプログラムがクラッシュせずに動き続けるようにしましょう、というプログラミング手法のことを言うらしい。なんか防衛的とかかっこよく言っているが、適当にバグを握りつぶすコードを入れておけっていう手法にも見える。

契約による設計はD言語使いにはおなじみの概念だ。不変条件や事前事後条件として常にtrueでなければならない契約を散りばめておき、それが失敗した時にすぐAssertion failureを返してプログラムを止めるという動作を行う。上記のアーティクルにある'Fail Fast'や'Offensive Programming'という言葉と関連付けられることも多い。防衛的プログラミングとは逆に、まずい動作をしそうになったらすぐクラッシュという動作だ。

開発中はOffensiveに、リリース時はDefensiveに、という具合に使い分ければいいんだろうけど、結構面倒だ。こいつらを同時にやろうとすると、こんな感じのコードになるらしい。

void test( int *p ) {
    assert( p != 0 );
    if (p == 0)
        return;
    // use p.
}

まあ確かにここまでやれば万全な気がするが、面倒すぎる。assertってリリース時には単に削除されるのが普通だけど、リリース時にはこう動作しなさいっていう防衛的な処理を記述できるassertとか、世の中に存在するのかな。それはもうassertじゃないのかもしれんが。