Simple, Slowly

ブログを引っ越ししました。http://48.jp

ケアレスミスに関してのコードの話し

システム作りの仕事をはじめて5年目になりますが、バグを出さないシステムを作るのは本当に難しいと思います。

 

バグは、ここは怪しいなと思っていたところで発生します。

そして、ここは出るはずがないだろうと思っていたところでも発生します。

 

ここは出るはずがないだろうと思っているところで発生する原因は、だいたいケアレスミスです。

 

例えば、以下のコード。

何でも無いコードです。

 

$date = date('y-m-d');

if ($date == '2012-06-26')

{

    // 2012-06-26に通る 

} else {

  // それ以外はこっち

}

 

このコードですが、2012-06-26が通ることはありません。

というのも、date('y-m-d')の書式が12-06-26と出力されるからです。

このバグのやっかいなところは、その時になって(だいたい本稼働で)問題が表面化するところです。

 

おそらく、テストするときは、以下のように変数に代入してコードが通るのを確認するでしょう。

$date = '2012-06-26';

たしかに通ることは確認できますが、date()を使っていません。

そこが落とし穴なのです。

 

この場合は、date('y-m-d');の部分をwrapする関数を使用すればバグを早期に発見することができます。

 

fuction getDate()

{

    return date('Y-m-d');

}

 

あとは、テストユニットで戻り値の書式が正しいかどうかを判定すればよいです。

 

こうやって、機能を細分化してテストを作成してシステムの信頼性を上げていくのがバグを減らすには有効だと思います。

 

ほんと、バグを無くすのは、なかなか大変です。

 

自動で間違いを指摘してくれるエディタやプラグインがあればいいんですけどね。

 

 

*追記

記事を書いた後にふと思ったのですが、日付の比較はstrtotime関数を使用すればフォーマットに関係なく比較できるので、そちらを使うほうがよいですね。